ModalAI Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    PX4 -> QGC connection through USB for VOXL2

    Ask your questions right here!
    8
    27
    1289
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      bendraper @Alex Kushleyev
      last edited by

      @Alex-Kushleyev So I can see a gadget functionality called gsi.rndis (I'd expect something called rndis.0 or something but maybe that is irrelevant) but when I change the line in /sbin/usb/compositions/901D to use gsi.rndis instead of ncm.0, my network interface on windows disappears and I can no longer ADB. I'd imagine there's something at the kernal level that doesn't like that but I'm out of my wheelhouse there. Setting it back to ncm.0 returns to the previous state but still cannot ping. Wireshark doesn't even see anything happening over that interface

      1 Reply Last reply Reply Quote 0
      • Zachary Lowell 0Z
        Zachary Lowell 0 ModalAI Team
        last edited by

        Hi All - gonna spend a bit of time looking into this today so I can get some context on the problem.

        Zach

        B 1 Reply Last reply Reply Quote 0
        • Q
          qt
          last edited by qt

          This post is deleted!
          Q 1 Reply Last reply Reply Quote 0
          • Q
            qt @qt
            last edited by

            This post is deleted!
            1 Reply Last reply Reply Quote 0
            • Q
              qt @Alex Kushleyev
              last edited by

              @Alex-Kushleyev
              That's not perfect but I created a shell script based on https://docs.modalai.com/qgc-via-adb/ for the drone configuraiton.
              For my PC configuration, I created an udev rule to force an interface name since usb0 is renamed in "enx******". My udev rule can only work with my drone (I think). To define IP address, I add a conf file in /etc/systemd/network/
              I have only tested on my linux and it works perfectly :

              #!/usr/bin/env bash
              set -euo pipefail
              
              # See ModalAI doc : https://docs.modalai.com/qgc-via-adb/
              
              UDEV_RULE_DRONE="/etc/udev/rules.d/80-usb-ncm.rules"
              UDEV_RULE_PC="/etc/udev/rules.d/99-voxl-usb-ncm.rules"
              SYSTEMD_CONF_PC="/etc/systemd/network/10-voxl0.network"
              
              USB_COMP_QUALCOM="/sbin/usb/compositions/901D"
              
              # Network configuration
              USB_IFACE="usb0"
              USB_NET="192.168.7.0/24"
              PC_IP="192.168.7.1"
              DRONE_IP="192.168.7.2"
              NM_CONN_NAME="voxl-usb-ncm"
              
              show_help() {
                  echo "Usage: $0 [--pc] [--drone] [--uninstall]"
                  echo
                  echo "Enable USB NCM networking for ModalAI VOXL / Starling 2 Max"
                  echo
                  echo "Options:"
                  echo "  --pc         Configure host PC only"
                  echo "  --drone      Configure drone via adb only"
                  echo "  --uninstall  Remove configuration"
                  echo "  --help       Show this help"
                  echo
                  echo "Defaults: if neither --pc nor --drone is provided, both are processed."
              }
              
              do_pc_install() {
                  echo "[INFO][PC] Installing udev rule for VOXL USB NCM"
              
                  cat > "$UDEV_RULE_PC" <<EOF
              SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="901d", ATTRS{serial}=="890d035c", NAME="voxl0"
              EOF
              
                  echo "[INFO][PC] Creating systemd-networkd config for voxl0"
              
                  cat > "$SYSTEMD_CONF_PC" <<EOF
              [Match]
              Name=voxl0
              
              [Network]
              Address=${PC_IP}/24
              LinkLocalAddressing=no
              IPv6AcceptRA=no
              EOF
              
                  echo "[INFO][PC] Reloading udev rules"
                  udevadm control --reload-rules
                  udevadm trigger
              
                  echo "[INFO][PC] Restarting systemd-networkd"
                  systemctl restart systemd-networkd
              
                  echo "[INFO][PC] PC installation complete"
              }
              
              do_pc_uninstall() {
                  echo "[INFO][PC] Removing PC configuration"
              
                  if [ -f "$UDEV_RULE_PC" ]; then
                    rm -f "$UDEV_RULE_PC"
                    echo "[INFO][PC] Removed udev rule"
                  fi
              
                  if [ -f "$SYSTEMD_CONF_PC" ]; then
                    rm -f "$SYSTEMD_CONF_PC"
                    echo "[INFO][PC] Removed systemd-networkd config"
                  fi
              
                  echo "[INFO][PC] Reloading udev rules"
                  udevadm control --reload-rules
                  udevadm trigger
              
                  echo "[INFO][PC] Restarting systemd-networkd"
                  systemctl restart systemd-networkd
              
                  echo "[INFO][PC] PC uninstallation complete"
              }
              
              do_drone_install() {
                  echo "[INFO][DRONE] Enabling USB NCM networking on VOXL via adb"
              
                  adb root
                  adb remount
              
                  echo "[INFO][DRONE] Updating USB composition in Qualcomm script \
              $USB_COMP_QUALCOM configure the usb gadget with \
              the addition of the function NCM"
                  echo "[INFO][DRONE] In $USB_COMP_QUALCOM, \
              add the line 'ln -s functions/ncm.0 configs/c.1/f3 2>/dev/null | true' \
              just after the line 'ln -s functions/ffs.adb configs/c.1/f2'"
                  
                  adb shell "sed -i '/ln -s functions\\/ffs.adb configs\\/c.1\\/f2/a \
                  \\        ln -s functions\\/ncm.0 configs\\/c.1\\/f3 2>\\/dev\\/null | true' \
                  $USB_COMP_QUALCOM"
              
                  echo "[INFO][DRONE] Creating udev rule $UDEV_RULE_DRONE for usb0 with IP ${DRONE_IP}"
                  
                  adb shell "cat << 'EOF' > $UDEV_RULE_DRONE
              ACTION==\"add\", SUBSYSTEM==\"net\", KERNEL==\"usb0\", \
              RUN+=\"/bin/sh -c 'sleep 2; /sbin/ifconfig usb0 ${DRONE_IP} netmask 255.255.255.0 up'\"
              EOF"
              
                  echo "[INFO][DRONE] NCM enabled — reboot required"
              }
              
              do_drone_uninstall() {
                  echo "[INFO][DRONE] Removing NCM configuration"
              
                  adb root
                  adb remount
              
                  echo "[INFO][DRONE] Removing udev rule $UDEV_RULE_DRONE"
                  adb shell "rm -f $UDEV_RULE_DRONE || true"
              
                  echo "[INFO][DRONE] Reverting USB composition (901D)"
                  adb shell "
                  sed -i '/ln -s functions\\/ncm.0 configs\\/c.1\\/f3/d' \
                  $USB_COMP_QUALCOM
                  "
              
                  echo "[INFO][DRONE] USB NCM configuration removed"
                  echo "[INFO][DRONE] Reboot required to fully apply changes"
              }
              
              
              # Arg parsing
              TARGET_PC=false
              TARGET_DRONE=false
              DO_UNINSTALL=false
              
              for arg in "$@"; do
                case "$arg" in
                  --help) show_help; exit 0 ;;
                  --pc) TARGET_PC=true ;;
                  --drone) TARGET_DRONE=true ;;
                  --uninstall) DO_UNINSTALL=true ;;
                  *)
                    echo "[ERROR] Unknown argument: $arg";
                    show_help;
                    exit 1 ;;
                esac
              done
              
              # Default to both if none selected
              if ! $TARGET_PC && ! $TARGET_DRONE; then
                TARGET_PC=true
                TARGET_DRONE=true
              fi
              
              # Execute
              if $DO_UNINSTALL; then
                $TARGET_PC && do_pc_uninstall
                $TARGET_DRONE && do_drone_uninstall
              else
                $TARGET_PC && do_pc_install
                $TARGET_DRONE && do_drone_install
              fi
              
              echo "[INFO] All done."
              ``
              
              1 Reply Last reply Reply Quote 0
              • B
                bendraper @Zachary Lowell 0
                last edited by

                @Zachary-Lowell-0 Hey Zach did you discover anything in this effort? I played around with recompiling the kernel to include the CONFIG_USB_CONFIGFS_RNDIS=y flag and confirmed it took on my Voxl 2 Mini, and can see the existence of a new rndis.rndis function in the usb gadget functions directory, but when I try to reconfigure the 901D config file, I end up just breaking the USB port entirely.

                1 Reply Last reply Reply Quote 0
                • Zachary Lowell 0Z
                  Zachary Lowell 0 ModalAI Team
                  last edited by

                  @qt said in PX4 -> QGC connection through USB for VOXL2:

                  name

                  @bendraper I kind of redid exactly what you described above and ran into very similar issue in the sense that it basically rocked my usb-c port. All this to say, I think we should choose a different route - is it possible instead to route the packets via adb over the USB-C port instead to basically get the same result? Point the software to the serial connection and leverage ADB to pull the packets that are forwarded? Basically creating our own sudo rndis connection almost.

                  Zach

                  B 1 Reply Last reply Reply Quote 0
                  • B
                    bendraper @Zachary Lowell 0
                    last edited by

                    @Zachary-Lowell-0 This would probably work but for my use case I cannot guarantee ADB being an option unfortunately.

                    Alex KushleyevA 1 Reply Last reply Reply Quote 0
                    • Alex KushleyevA
                      Alex Kushleyev ModalAI Team @bendraper
                      last edited by Alex Kushleyev

                      @bendraper , have you considered running a docker container (VM) on your Windows machine with a minimal Linux kernel that would use the Linux drivers for NCM and create the proper network connection between VOXL2 and Linux container. Then you could potentially set up the routing table in Windows so that it can access the device via the Linux container and linux container may need to have some networking magic down as well to pass through the communication?

                      Alex

                      1 Reply Last reply Reply Quote 0
                      • Zachary Lowell 0Z
                        Zachary Lowell 0 ModalAI Team
                        last edited by

                        ^^^ This is the next best option outside of ADB IMO - nice suggestion @Alex-Kushleyev

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post
                        Powered by NodeBB | Contributors