diff --git a/main/postmarketos-usb-moded/APKBUILD b/main/postmarketos-usb-moded/APKBUILD new file mode 100644 index 000000000..ebc757762 --- /dev/null +++ b/main/postmarketos-usb-moded/APKBUILD @@ -0,0 +1,102 @@ +# Maintainer: Clayton Craft +pkgname=postmarketos-usb-moded +pkgver=1 +pkgrel=0 +pkgdesc="Meta package for configuring usb-moded on postmarketOS" +url="https://postmarketos.org" +arch="noarch" +license="GPL-3.0-or-later" +depends=" + umtprd + usb-moded + usb-moded-notify +" +subpackages=" + $pkgname-default-profile-charging:charging_default + $pkgname-default-profile-developer:developer_default + $pkgname-systemd +" +_pmb_select="$pkgname-default-profile" + +_source644=" + etc/usb-moded/configfs.ini + etc/usb-moded/dyn-modes/developer_mode_systemd.ini + etc/usb-moded/dyn-modes/tethering_mode_systemd.ini + etc/usb-moded/dyn-modes/mtp_ffs_mode_systemd.ini + etc/umtprd/umtprd.conf + usr/lib/systemd/system/usb-moded-developer-mode.service + usr/lib/systemd/system/usb-moded-tethering-mode.service + usr/lib/systemd/system/usb-moded.service.d/override.conf +" +_source755=" + usr/bin/usb-moded-developer-mode + usr/bin/usb-moded-tethering-mode +" + +# Avoid filename based checksum conflicts by including the whole path. +flatpath() { + local i + for i in $@; do + echo "rootfs-$i" | sed s./.-.g + done +} +source="$(flatpath $_source644 $_source600 $_source755)" + +package() { + # usb-moded default profile config are provided by subpackages in this + # APKBUILD and it won't exist when this is evaluated at the top level. + # It's moved into this function to work around it. + depends=" + $depends + $pkgname-default-profile + " + + local i + for i in $_source644; do + install -Dm644 "$srcdir/$(flatpath "$i")" "$pkgdir/$i" + done + for i in $_source600; do + install -Dm600 "$srcdir/$(flatpath "$i")" "$pkgdir/$i" + done + for i in $_source755; do + install -Dm755 "$srcdir/$(flatpath "$i")" "$pkgdir/$i" + done +} + +charging_default() { + pkgdesc="Make 'charging mode' the default usb-moded profile (usb networking must be manually enabled)" + provides="$pkgname-default-profile=$pkgver-r$pkgrel" + provider_priority=90 + + mkdir -p "$subpkgdir"/etc/usb-moded + cat <<-EOF > "$subpkgdir"/etc/usb-moded/usbmode.ini + [usbmode] + mode = charging_only + EOF +} + +developer_default() { + pkgdesc="Make 'developer mode' the default usb-moded profile (always enables usb networking)" + provides="$pkgname-default-profile=$pkgver-r$pkgrel" + # We want this mode to be the default if not specified with e.g. pmb_select + provider_priority=100 + + mkdir -p "$subpkgdir"/etc/usb-moded + cat <<-EOF > "$subpkgdir"/etc/usb-moded/usbmode.ini + [usbmode] + mode = developer_mode + EOF +} + +sha512sums=" +231c1cfb991bb4d9f9807bb81e970bc2f63b7ea6e9bb06cf06a698af69b4a9f82f015252ec4c802ad0f8b58456d624f07e62902f04207dc5bac76cc785c296a7 rootfs-etc-usb-moded-configfs.ini +d373201040a911663fd74123e9ef35e43dedfd375eeefe8ca949a3e24737d457a4693e836b1c5ad6f4cf3149b656ae24d751f767babb9858a42114c5d2ad083e rootfs-etc-usb-moded-dyn-modes-developer_mode_systemd.ini +3d4e20f9e8e357030ce5f5c73367aef31cebecce48a9b1ff7915731335a83715e0679812959ac9ee41f88447a8636177244c0b9c5109cd8a227caecb9931ed9e rootfs-etc-usb-moded-dyn-modes-tethering_mode_systemd.ini +af41dc4ceb7255dbb88273916306c6e7e66c879bb67523c9571f9e812c9b36ab00ea666ade49369cd5846b4552a53add58cd1aea574a496bf53ddd3fbc630922 rootfs-etc-usb-moded-dyn-modes-mtp_ffs_mode_systemd.ini +912f0700c87883b55f631cfc3d76e172ff1c21aa57b0c18d1e7b9671ecd6254b1e7565816e3967c68caab196076bf7c8b848375c89185aa4466f4ca7f65231be rootfs-etc-umtprd-umtprd.conf +2c838fd0ad66c92386f6159c7d96d3ba940e13834642eb2cb7612d79d6b8832e9bd06b1eb189141f21fa9085d8b43ea514c15d82736ebd6b94533811f5a15f11 rootfs-usr-lib-systemd-system-usb-moded-developer-mode.service +56ce2662dd8f88795bd2e9063f20747e1377d896fbcf9e1ae43c90ef511c4a11517d7c673f857cf194070c425f417df8f40ced9b95749ed1df53e1be122a8ef7 rootfs-usr-lib-systemd-system-usb-moded-tethering-mode.service +79dc304cc5d455135f929a0ba60487f03b1b66d09245d972f685ee5ddabc8414f74159e47bbb13bff862163fa07dd9497a30ab7e32074bff95f2189685d851a2 rootfs-usr-lib-systemd-system-usb-moded.service.d-override.conf +9aab1a91a817e2337320ee0fa1bf6133e65e9269631560c1860c3b777adb336d036cebbc2510d1df35a82bf4396d553ff9e2edd0004027c7a3130168f7f50d90 rootfs-usr-bin-usb-moded-developer-mode +5cc40b1a0c86904d824f8f03e3f44900aaf407c5c462902f4f58cd58c603be1c5919651b91320983e21da42f5891e29df504bf4f1bddef64fedc68c2accdccbc rootfs-usr-bin-usb-moded-tethering-mode +" diff --git a/main/postmarketos-usb-moded/rootfs-etc-umtprd-umtprd.conf b/main/postmarketos-usb-moded/rootfs-etc-umtprd-umtprd.conf new file mode 100644 index 000000000..58088ac3a --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-etc-umtprd-umtprd.conf @@ -0,0 +1,16 @@ +# FunctionFS configuration +usb_functionfs_mode 0x1 +usb_dev_path "/dev/mtp/ep0" +usb_epin_path "/dev/mtp/ep1" +usb_epout_path "/dev/mtp/ep2" +usb_epint_path "/dev/mtp/ep3" +usb_max_packet_size 0x200 + +# Prevent disconnection on cable status, managed by usb-moded +loop_on_disconnect 1 + +# Storage to expose over MTP +storage "/home" "Home" "rw" + +manufacturer "postmarketOS" +product "Device" diff --git a/temp/usb-moded/configfs.ini b/main/postmarketos-usb-moded/rootfs-etc-usb-moded-configfs.ini similarity index 100% rename from temp/usb-moded/configfs.ini rename to main/postmarketos-usb-moded/rootfs-etc-usb-moded-configfs.ini diff --git a/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-developer_mode_systemd.ini b/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-developer_mode_systemd.ini new file mode 100644 index 000000000..c9b563dce --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-developer_mode_systemd.ini @@ -0,0 +1,12 @@ +[mode] +name=developer_mode +module=none +network=0 + +[options] +idProduct=0xD001 +idVendorOverride=0x18D1 +sysfs_value=ncm.usb0 +dhcp_server=0 +command_up=systemctl start usb-moded-developer-mode +command_down=systemctl stop usb-moded-developer-mode diff --git a/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-mtp_ffs_mode_systemd.ini b/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-mtp_ffs_mode_systemd.ini new file mode 100644 index 000000000..b6bafcb55 --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-mtp_ffs_mode_systemd.ini @@ -0,0 +1,11 @@ +[mode] +name=mtp_ffs_mode +module=none + +[options] +idProduct=0x1D6B +idVendorOverride=0x0100 +sysfs_value=ffs.mtp +command_up=systemctl start umtprd +command_down=systemctl stop umtprd +ffs_daemon_mountpoint=mtp diff --git a/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-tethering_mode_systemd.ini b/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-tethering_mode_systemd.ini new file mode 100644 index 000000000..9d6930354 --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-etc-usb-moded-dyn-modes-tethering_mode_systemd.ini @@ -0,0 +1,12 @@ +[mode] +name=tethering_mode +module=none +network=0 + +[options] +idProduct=0xD001 +idVendorOverride=0x18D1 +sysfs_value=ncm.usb0 +dhcp_server=0 +command_up=systemctl start usb-moded-tethering-mode +command_down=systemctl stop usb-moded-tethering-mode diff --git a/main/postmarketos-usb-moded/rootfs-usr-bin-usb-moded-developer-mode b/main/postmarketos-usb-moded/rootfs-usr-bin-usb-moded-developer-mode new file mode 100644 index 000000000..65db8dbfb --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-usr-bin-usb-moded-developer-mode @@ -0,0 +1,47 @@ +#!/bin/sh +# Enable/disable developer USB mode by delegating network operations to NetworkManager +# Dynamically generate NetworkManager connection because it is only available in the right USB mode +# +# Copyright (c) Dylan Van Assche (2025) + +IFACE=usb0 +IP_ADDRESS_SERVER=172.16.42.1 +IP_ADDRESS_CLIENT=172.16.42.2 +CONNECTION_NAME="USB Developer Mode" + +up() { + # Bring interface and NetworkManager connection up + nmcli connection add con-name "$CONNECTION_NAME" type ethernet \ + ifname "$IFACE" ipv4.method manual ipv4.addresses "$IP_ADDRESS_SERVER"/16 + nmcli connection up "$CONNECTION_NAME" + + # Start DHCP server + unudhcpd -i "$IFACE" -s "$IP_ADDRESS_SERVER" -c "$IP_ADDRESS_CLIENT" & +} + +down() { + # Stop DHCP server + killall -9 unudhcpd + + # Bring NetworkManager connection down + nmcli connection down "$CONNECTION_NAME" + nmcli connection delete "$CONNECTION_NAME" + + # NetworkManager brings the interface up automatically, + # but doesn't remove it when bringing down. + ifconfig "$IFACE" down +} + +case $1 in + up) + up + ;; + down) + down + ;; + *) + echo "need an argument (up|down)" + exit 0 + ;; +esac + diff --git a/main/postmarketos-usb-moded/rootfs-usr-bin-usb-moded-tethering-mode b/main/postmarketos-usb-moded/rootfs-usr-bin-usb-moded-tethering-mode new file mode 100644 index 000000000..a11bee83f --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-usr-bin-usb-moded-tethering-mode @@ -0,0 +1,39 @@ +#!/bin/sh +# Enable/disable tethering USB mode by delegating network operations to NetworkManager. +# Dynamically generate NetworkManager connection because it is only available in the right USB mode. +# +# Copyright (c) Dylan Van Assche (2025) + +IFACE=usb0 +CONNECTION_NAME="USB Tethering Mode" + +up() { + # Bring interface and NetworkManager connection up + nmcli connection add con-name "$CONNECTION_NAME" type ethernet \ + ifname "$IFACE" ipv4.method shared + nmcli connection up "$CONNECTION_NAME" +} + +down() { + # Bring NetworkManager connection down + nmcli connection down "$CONNECTION_NAME" + nmcli connection delete "$CONNECTION_NAME" + + # NetworkManager brings the interface up automatically, + # but doesn't remove it when bringing down. + ifconfig "$IFACE" down +} + +case $1 in + up) + up + ;; + down) + down + ;; + *) + echo "need an argument (up|down)" + exit 0 + ;; +esac + diff --git a/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded-developer-mode.service b/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded-developer-mode.service new file mode 100644 index 000000000..d8df1e24d --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded-developer-mode.service @@ -0,0 +1,11 @@ +[Unit] +Description=USB Moded Developer Mode + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=usb-moded-developer-mode up +ExecStop=usb-moded-developer-mode down + +[Install] +WantedBy=multi-user.target diff --git a/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded-tethering-mode.service b/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded-tethering-mode.service new file mode 100644 index 000000000..2675dfe89 --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded-tethering-mode.service @@ -0,0 +1,11 @@ +[Unit] +Description=USB Moded Tethering Mode + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=usb-moded-tethering-mode up +ExecStop=usb-moded-tethering-mode down + +[Install] +WantedBy=multi-user.target diff --git a/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded.service.d-override.conf b/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded.service.d-override.conf new file mode 100644 index 000000000..9e4e39225 --- /dev/null +++ b/main/postmarketos-usb-moded/rootfs-usr-lib-systemd-system-usb-moded.service.d-override.conf @@ -0,0 +1,8 @@ +[Unit] +After=default.target + +[Service] +ExecStartPre=-/usr/bin/killall unudhcpd +ExecStartPre=mkdir -p /config +ExecStartPre=/bin/mount -t configfs none /config +