Deploy IMU driver and configure IRQs

The IRQs didn't match the existing IRQs.  Update them to be more
flexible and not depend on IRQ numbers since those appear to change.

wiringpi wasn't building for me, so I built the .deb and installed that
in the rootfs so I could make progress again.

While we are here, deploy to ~/bin instead of ~/robot_code/ so it is in
the path everywhere.  To make things actually easy to use, we need to
change how the config is found, but until then, this gets us closer to
easy to use.

Change-Id: Ib2f900f59bb6cc3de8f97e7687e723f6c8d003e7
Signed-off-by: Austin Schuh <austin.linux@gmail.com>
diff --git a/aos/starter/starter.sh b/aos/starter/starter.sh
index d5812c2..ff210dc 100755
--- a/aos/starter/starter.sh
+++ b/aos/starter/starter.sh
@@ -1,62 +1,27 @@
 #!/bin/bash
 
+set -x
+
 if [[ "$(hostname)" == "roboRIO"* ]]; then
   /usr/local/natinst/etc/init.d/systemWebServer stop
 
-  ROBOT_CODE="/home/admin/robot_code"
+  ROBOT_CODE="/home/admin/bin"
 
   # Get the CTRE libraries in the shared library search path
   for f in $(ls *.so);
   do
-    ln -f -s /home/admin/robot_code/$f /usr/local/frc/third-party/lib/$f
+    ln -f -s /home/admin/bin/$f /usr/local/frc/third-party/lib/$f
   done
 
   ln -s /var/local/natinst/log/FRC_UserProgram.log /tmp/FRC_UserProgram.log
   ln -s /var/local/natinst/log/FRC_UserProgram.log "${ROBOT_CODE}/FRC_UserProgram.log"
 elif [[ "$(hostname)" == "pi-"* ]]; then
-  function chrtirq() {
-    ps -ef | grep "\\[$1\\]" | awk '{print $2}' | xargs chrt $2 -p $3
-  }
-
-  chrtirq "irq/20-fe00b880" -f 50
-  chrtirq "irq/66-xhci_hcd" -f 1
-  chrtirq "irq/50-VCHIQ do" -o 0
-  chrtirq "irq/27-DMA IRQ" -f 50
-  chrtirq "irq/51-mmc1" -o 0
-  chrtirq "irq/51-mmc0" -o 0
-  chrtirq "irq/51-s-mmc0" -o 0
-  chrtirq "irq/64-v3d" -o 0
-  chrtirq "irq/24-vc4 hvs" -o 0
-  chrtirq "irq/42-vc4 hdmi" -o 0
-  chrtirq "irq/43-vc4 hdmi" -o 0
-  chrtirq "irq/39-vc4 hdmi" -o 0
-  chrtirq "irq/39-s-vc4 hd" -o 0
-  chrtirq "irq/38-vc4 hdmi" -o 0
-  chrtirq "irq/38-s-vc4 hd" -o 0
-  chrtirq "irq/29-DMA IRQ" -f 50
-  chrtirq "irq/48-vc4 hdmi" -o 0
-  chrtirq "irq/49-vc4 hdmi" -o 0
-  chrtirq "irq/45-vc4 hdmi" -o 0
-  chrtirq "irq/45-s-vc4 hd" -o 0
-  chrtirq "irq/44-vc4 hdmi" -o 0
-  chrtirq "irq/44-s-vc4 hd" -o 0
-  chrtirq "irq/30-DMA IRQ" -f 50
-  chrtirq "irq/19-fe004000" -f 50
-  chrtirq "irq/34-vc4 crtc" -o 0
-  chrtirq "irq/35-vc4 crtc" -o 0
-  chrtirq "irq/36-vc4 crtc" -o 0
-  chrtirq "irq/35-vc4 crtc" -o 0
-  chrtirq "irq/37-vc4 crtc" -o 0
-  chrtirq "irq/23-uart-pl0" -o 0
-  chrtirq "irq/57-eth0" -f 10
-  chrtirq "irq/58-eth0" -f 10
-
   # We have systemd configured to handle restarting, so just exec.
-  export PATH="${PATH}:/home/pi/robot_code"
+  export PATH="${PATH}:/home/pi/bin"
   rm -rf /dev/shm/aos
   exec starterd
 else
-  ROBOT_CODE="${HOME}/robot_code"
+  ROBOT_CODE="${HOME}/bin"
 fi
 
 cd "${ROBOT_CODE}"
diff --git a/frc971/config/robotCommand b/frc971/config/robotCommand
index 7b726a7..cb1d6f1 100755
--- a/frc971/config/robotCommand
+++ b/frc971/config/robotCommand
@@ -1 +1 @@
-/home/admin/robot_code/starter.sh
+/home/admin/bin/starter.sh
diff --git a/frc971/config/setup_roborio.sh b/frc971/config/setup_roborio.sh
index f00212f..3434482 100755
--- a/frc971/config/setup_roborio.sh
+++ b/frc971/config/setup_roborio.sh
@@ -30,11 +30,11 @@
   ssh "admin@${ROBOT_HOSTNAME}" 'echo "alias l=\"ls -la\"" >> /etc/profile'
   echo "Adding symbolic link to loging directory"
   ssh "admin@${ROBOT_HOSTNAME}" ln -s /media/sda1 logs
-  ssh "admin@${ROBOT_HOSTNAME}" mkdir robot_code
-  ssh "admin@${ROBOT_HOSTNAME}" ln -s /media/sda1/aos_log-current robot_code/aos_log-current
+  ssh "admin@${ROBOT_HOSTNAME}" mkdir bin
+  ssh "admin@${ROBOT_HOSTNAME}" ln -s /media/sda1/aos_log-current bin/aos_log-current
   echo "Adding aos_dump autocomplete to profile"
-  ssh "admin@${ROBOT_HOSTNAME}" 'echo "if [ -f /home/admin/robot_code/aos_dump_autocomplete.sh ]; then source /home/admin/robot_code/aos_dump_autocomplete.sh; fi;" >> /etc/profile'
-  ssh "admin@${ROBOT_HOSTNAME}" 'echo "export PATH=\"\${PATH}:/home/admin/robot_code:/home/admin/bin\"" >> /etc/profile'
+  ssh "admin@${ROBOT_HOSTNAME}" 'echo "if [ -f /home/admin/bin/aos_dump_autocomplete.sh ]; then source /home/admin/bin/aos_dump_autocomplete.sh; fi;" >> /etc/profile'
+  ssh "admin@${ROBOT_HOSTNAME}" 'echo "export PATH=\"\${PATH}:/home/admin/bin\"" >> /etc/profile'
 fi
 
 ssh "admin@${ROBOT_HOSTNAME}" "sed -i 's/vm\.overcommit_memory=2/vm\.overcommit_memory=0/' /etc/sysctl.conf"
diff --git a/frc971/downloader.bzl b/frc971/downloader.bzl
index aebcb87..ec93f5b 100644
--- a/frc971/downloader.bzl
+++ b/frc971/downloader.bzl
@@ -25,7 +25,7 @@
         ] if target_type == "roborio" else []) + start_binaries,
         srcs = [
             "//aos:prime_binaries",
-        ] + binaries + data,
+        ] + binaries + data + ["//frc971/raspi/rootfs:chrt.sh"],
         dirs = dirs,
         target_type = target_type,
         default_target = default_target,
@@ -40,7 +40,7 @@
                      [expand_label(binary) + ".stripped" for binary in start_binaries],
         srcs = [
             "//aos:prime_binaries_stripped",
-        ] + [expand_label(binary) + ".stripped" for binary in binaries] + data,
+        ] + [expand_label(binary) + ".stripped" for binary in binaries] + data + ["//frc971/raspi/rootfs:chrt.sh"],
         dirs = dirs,
         target_type = target_type,
         default_target = default_target,
diff --git a/frc971/downloader/downloader.py b/frc971/downloader/downloader.py
index dc14df1..4314845 100644
--- a/frc971/downloader/downloader.py
+++ b/frc971/downloader/downloader.py
@@ -69,7 +69,7 @@
             user = "pi"
         elif args.type == "roborio":
             user = "admin"
-    target_dir = "/home/" + user + "/robot_code"
+    target_dir = "/home/" + user + "/bin"
 
     ssh_target = "%s@%s" % (user, hostname)
 
diff --git a/frc971/raspi/rootfs/BUILD b/frc971/raspi/rootfs/BUILD
new file mode 100644
index 0000000..ee5984a
--- /dev/null
+++ b/frc971/raspi/rootfs/BUILD
@@ -0,0 +1 @@
+exports_files(["chrt.sh"])
diff --git a/frc971/raspi/rootfs/chrt.sh b/frc971/raspi/rootfs/chrt.sh
new file mode 100755
index 0000000..535f4c6
--- /dev/null
+++ b/frc971/raspi/rootfs/chrt.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+set -e
+
+function chrtirq() {
+  PIDS="$(ps -ef | grep "\\[$1\\]" | awk '{print $2}')"
+
+  for PID in $PIDS; do
+    chrt $2 -p $3 "${PID}"
+
+    ps -q "${PID}" -o comm= | tr -d '[:space:]'
+    echo -n " "
+    chrt -p "${PID}"
+  done
+
+  if [ -z "${PID}" ]; then
+    echo "No such IRQ ${1}"
+  fi
+}
+
+chrtirq "irq/[0-9]*-fe00b880" -f 50
+chrtirq "irq/[0-9]*-fe204000" -f 60
+chrtirq "irq/[0-9]*-adis1650" -f 61
+chrtirq "irq/[0-9]*-xhci_hcd" -f 1
+chrtirq "irq/[0-9]*-VCHIQ do" -o 0
+chrtirq "irq/[0-9]*-DMA IRQ" -f 50
+chrtirq "irq/[0-9]*-mmc1" -o 0
+chrtirq "irq/[0-9]*-mmc0" -o 0
+chrtirq "irq/[0-9]*-s-mmc0" -o 0
+chrtirq "irq/[0-9]*-v3d" -o 0
+chrtirq "irq/24-vc4 hvs" -o 0
+chrtirq "irq/[0-9]*-vc4 hdmi" -o 0
+chrtirq "irq/[0-9]*-s-vc4 hd" -o 0
+chrtirq "irq/19-fe004000" -f 50
+chrtirq "irq/[0-9]*-vc4 crtc" -o 0
+chrtirq "irq/23-uart-pl0" -o 0
+chrtirq "irq/[0-9]*-eth0" -f 10
diff --git a/frc971/raspi/rootfs/enable_imu.sh b/frc971/raspi/rootfs/enable_imu.sh
new file mode 100755
index 0000000..3725207
--- /dev/null
+++ b/frc971/raspi/rootfs/enable_imu.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+CONFIG=/boot/config.txt
+
+if grep -q adis16505 "${CONFIG}"; then
+  echo "Already enabled"
+  exit 0;
+fi
+
+sed -i '1h;1!H;$!d;x;s/.*dtparam=spi[^\n]*/&\n\n# Enable the IMU\ndtoverlay=adis16505/' "${CONFIG}"
+
+echo "Enabled 16505"
diff --git a/frc971/raspi/rootfs/frc971.service b/frc971/raspi/rootfs/frc971.service
index cdfb347..be6b37f 100644
--- a/frc971/raspi/rootfs/frc971.service
+++ b/frc971/raspi/rootfs/frc971.service
@@ -7,8 +7,8 @@
 User=pi
 Group=pi
 Type=simple
-WorkingDirectory=/home/pi/robot_code
-ExecStart=/home/pi/robot_code/starter.sh
+WorkingDirectory=/home/pi/bin
+ExecStart=/home/pi/bin/starter.sh
 KillMode=mixed
 TimeoutStopSec=10
 LimitRTPRIO=60
diff --git a/frc971/raspi/rootfs/frc971chrt.service b/frc971/raspi/rootfs/frc971chrt.service
index cc68934..6086fa0 100644
--- a/frc971/raspi/rootfs/frc971chrt.service
+++ b/frc971/raspi/rootfs/frc971chrt.service
@@ -3,7 +3,7 @@
 
 [Service]
 Type=oneshot
-ExecStart=/home/pi/robot_code/chrt.sh
+ExecStart=/home/pi/bin/chrt.sh
 
 [Install]
 WantedBy=multi-user.target
diff --git a/frc971/raspi/rootfs/modify_rootfs.sh b/frc971/raspi/rootfs/modify_rootfs.sh
index fd9bec9..15bdd80 100755
--- a/frc971/raspi/rootfs/modify_rootfs.sh
+++ b/frc971/raspi/rootfs/modify_rootfs.sh
@@ -36,8 +36,13 @@
 if ! grep "gpu_mem=128" "${BOOT_PARTITION}/config.txt"; then
   echo "gpu_mem=128" | sudo tee -a "${BOOT_PARTITION}/config.txt"
 fi
+if ! grep "enable_uart=1" "${BOOT_PARTITION}/config.txt"; then
+  echo "enable_uart=1" | sudo tee -a "${BOOT_PARTITION}/config.txt"
+fi
 # For now, disable the new libcamera driver in favor of legacy ones
 sudo sed -i s/^camera_auto_detect=1/#camera_auto_detect=1/ "${BOOT_PARTITION}/config.txt"
+# Enable SPI.
+sudo sed -i s/^.*dtparam=spi=on/dtparam=spi=on/ "${BOOT_PARTITION}/config.txt"
 
 sudo tar -zxvf "${KERNEL}" --strip-components 2 -C ${BOOT_PARTITION}/ ./fat32
 
@@ -80,11 +85,17 @@
   sudo mount -o loop,offset=${OFFSET} "${IMAGE}" "${PARTITION}"
 fi
 
+if [[ ! -e wiringpi-2.70-1.deb ]]; then
+  wget --continue https://software.frc971.org/Build-Dependencies/wiringpi-2.70-1.deb
+fi
+
 sudo cp target_configure.sh "${PARTITION}/tmp/"
+sudo cp wiringpi-2.70-1.deb "${PARTITION}/tmp/"
 sudo cp dhcpcd.conf "${PARTITION}/tmp/dhcpcd.conf"
 sudo cp sctp.conf "${PARTITION}/etc/sysctl.d/sctp.conf"
 sudo cp logind.conf "${PARTITION}/etc/systemd/logind.conf"
 sudo cp change_hostname.sh "${PARTITION}/tmp/change_hostname.sh"
+sudo cp enable_imu.sh "${PARTITION}/tmp/"
 sudo cp frc971.service "${PARTITION}/etc/systemd/system/frc971.service"
 sudo cp frc971chrt.service "${PARTITION}/etc/systemd/system/frc971chrt.service"
 sudo cp rt.conf "${PARTITION}/etc/security/limits.d/rt.conf"
@@ -96,6 +107,8 @@
 
 sudo rm -rf "${PARTITION}/lib/modules/"*
 sudo tar -zxvf "${KERNEL}" --strip-components 4 -C "${PARTITION}/lib/modules/" ./ext4/lib/modules/
+sudo cp adis16505.ko "${PARTITION}/lib/modules/5.10.78-rt55-v8+/kernel/"
+target /usr/sbin/depmod 5.10.78-rt55-v8+
 
 # Downloads and installs our target libraries
 target /bin/bash /tmp/target_configure.sh
diff --git a/frc971/raspi/rootfs/target_configure.sh b/frc971/raspi/rootfs/target_configure.sh
index 6d9171e..388d291 100755
--- a/frc971/raspi/rootfs/target_configure.sh
+++ b/frc971/raspi/rootfs/target_configure.sh
@@ -9,9 +9,12 @@
 
 # And provide a script to change it.
 cp /tmp/change_hostname.sh /root/bin/
+cp /tmp/enable_imu.sh /root/bin/
 chmod a+x /root/bin/change_hostname.sh
+chmod a+x /root/bin/enable_imu.sh
 
 chown -R pi.pi /home/pi/.ssh
+chown -R pi.pi /home/pi/bin
 
 apt-get update
 
@@ -41,13 +44,7 @@
   libnice-dev \
   feh
 
-# Install WiringPi gpio for PWM control
-if [[ ! -e "/usr/bin/gpio" ]]; then
-    cd /tmp
-    git clone https://github.com/WiringPi/WiringPi.git
-    cd WiringPi
-    ./build
-fi
+dpkg -i /tmp/wiringpi-2.70-1.deb
 
 echo 'GOVERNOR="performance"' > /etc/default/cpufrequtils
 
diff --git a/y2016/dashboard/dashboard.cc b/y2016/dashboard/dashboard.cc
index d01243f..a7cc821 100644
--- a/y2016/dashboard/dashboard.cc
+++ b/y2016/dashboard/dashboard.cc
@@ -301,7 +301,7 @@
   server.serve("www", 1180);
 #else
   // Absolute directory of www folder on the robot.
-  server.serve("/home/admin/robot_code/www", 1180);
+  server.serve("/home/admin/bin/www", 1180);
 #endif
 
   socket_handler.Quit();
diff --git a/y2019/vision/server/server.cc b/y2019/vision/server/server.cc
index 7334ab4..817da17 100644
--- a/y2019/vision/server/server.cc
+++ b/y2019/vision/server/server.cc
@@ -300,13 +300,13 @@
   bool serve_www = false;
   {
     struct stat result;
-    if (stat("/home/admin/robot_code/www", &result) == 0) {
+    if (stat("/home/admin/bin/www", &result) == 0) {
       serve_www = true;
     }
   }
 
   server.serve(
-      serve_www ? "/home/admin/robot_code/www" : "y2019/vision/server/www",
+      serve_www ? "/home/admin/bin/www" : "y2019/vision/server/www",
       1180);
 
   return 0;
diff --git a/y2020/vision/galactic_search_path.py b/y2020/vision/galactic_search_path.py
index 5e8ef54..00b572a 100755
--- a/y2020/vision/galactic_search_path.py
+++ b/y2020/vision/galactic_search_path.py
@@ -77,8 +77,8 @@
 AOS_SEND_PATH = "bazel-bin/aos/aos_send"
 
 def setup_if_pi():
-    if os.path.isdir("/home/pi/robot_code"):
-        AOS_SEND_PATH = "/home/pi/robot_code/aos_send.stripped"
+    if os.path.isdir("/home/pi/bin"):
+        AOS_SEND_PATH = "/home/pi/bin/aos_send.stripped"
         os.system("./starter_cmd stop camera_reader")
 
 setup_if_pi()