core: make detach non-destructive

This commit is contained in:
Brad Stein 2026-01-08 00:20:12 -03:00
parent 617a1d844f
commit 16c74879f2

View File

@ -13,21 +13,36 @@ find_udc() {
ls /sys/class/udc 2>/dev/null | head -n1 || true ls /sys/class/udc 2>/dev/null | head -n1 || true
} }
udc_state() {
local udc="$1"
if [[ -z $udc ]]; then
echo "unknown"
return 0
fi
cat "/sys/class/udc/$udc/state" 2>/dev/null || echo "unknown"
}
detach_gadget() { detach_gadget() {
local udc="" local udc=""
udc="$(find_udc)" udc="$(find_udc)"
local state
state="$(udc_state "$udc")"
case "$state" in
configured|addressed|default|suspended)
log "detach skipped (state=$state)"
return 0
;;
esac
if [[ -n $udc && -w /sys/class/udc/$udc/soft_connect ]]; then if [[ -n $udc && -w /sys/class/udc/$udc/soft_connect ]]; then
echo 0 >"/sys/class/udc/$udc/soft_connect" 2>/dev/null || true echo 0 >"/sys/class/udc/$udc/soft_connect" 2>/dev/null || true
fi fi
if [[ -e $G/UDC ]]; then if [[ -n ${LESAVKA_DETACH_CLEAR_UDC:-} && -e $G/UDC ]]; then
echo "" >"$G/UDC" 2>/dev/null || true echo "" >"$G/UDC" 2>/dev/null || true
fi fi
if [[ -n $udc && -f /sys/class/udc/$udc/state ]]; then if [[ -n $udc ]]; then
local state
state="$(cat "/sys/class/udc/$udc/state" 2>/dev/null || true)"
log "detached (state=${state:-unknown})" log "detached (state=${state:-unknown})"
else else
log "detached (no UDC state)" log "detached (no UDC)"
fi fi
} }
@ -42,7 +57,10 @@ attach_gadget() {
log "UDC not found; need full setup" log "UDC not found; need full setup"
return 1 return 1
fi fi
if [[ -e $G/UDC ]]; then if [[ -n $udc && -w /sys/class/udc/$udc/soft_connect ]]; then
echo 1 >"/sys/class/udc/$udc/soft_connect" 2>/dev/null || true
fi
if [[ -n ${LESAVKA_ATTACH_WRITE_UDC:-} && -e $G/UDC ]]; then
echo "$udc" >"$G/UDC" 2>/dev/null || true echo "$udc" >"$G/UDC" 2>/dev/null || true
fi fi
log "attached to $udc" log "attached to $udc"
@ -54,13 +72,17 @@ case "${1:-}" in
detach_gadget detach_gadget
exit 0 exit 0
;; ;;
--detach-hard)
LESAVKA_DETACH_CLEAR_UDC=1 detach_gadget
exit 0
;;
--attach) --attach)
if attach_gadget; then if attach_gadget; then
exit 0 exit 0
fi fi
;; ;;
--help|-h) --help|-h)
echo "Usage: $0 [--attach|--detach]" echo "Usage: $0 [--attach|--detach|--detach-hard]"
exit 0 exit 0
;; ;;
esac esac