122 lines
3.3 KiB
Bash
Executable file
122 lines
3.3 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# reset_lgw.sh (libgpiod version)
|
|
# Replaces legacy /sys/class/gpio export/direction/value usage.
|
|
#
|
|
# Usage:
|
|
# ./reset_lgw.sh start
|
|
# ./reset_lgw.sh stop
|
|
#
|
|
# Environment override:
|
|
# GPIOCHIP=gpiochip0 ./reset_lgw.sh start
|
|
#
|
|
|
|
set -eu
|
|
|
|
# --- GPIO mapping (BCM numbers) ---
|
|
SX1302_RESET_PIN=23 # SX1302 reset
|
|
SX1302_POWER_EN_PIN=18 # SX1302 power enable
|
|
SX1261_RESET_PIN=22 # SX1261 reset (LBT / Spectral Scan)
|
|
AD5338R_RESET_PIN=13 # AD5338R reset (reference design; may be unused on your HAT)
|
|
|
|
CHIP="${GPIOCHIP:-gpiochip0}"
|
|
|
|
# Small sleeps to let rails settle
|
|
WAIT() { sleep 0.10; }
|
|
|
|
# gpioset helper:
|
|
# libgpiod v1.x: gpioset defaults to holding the line until the process exits.
|
|
# Using "-m time -s <sec>" makes it deterministic for pulses.
|
|
#SET_FOR() {
|
|
# # $1=line $2=value $3=seconds
|
|
# /usr/sbin/gpioset -m time -s "$3" "$CHIP" "$1=$2" >/dev/null 2>&1 || {
|
|
# echo "ERROR: gpioset failed on $CHIP line $1=$2 (check chip name/permissions)" >&2
|
|
# exit 1
|
|
# }
|
|
#}
|
|
#
|
|
#SET_HOLD() {
|
|
# # Hold briefly but long enough for power enable
|
|
# # Using time mode too, so we don't leave lines requested forever.
|
|
# /usr/sbin/gpioset -m time -s 1.0 "$CHIP" "$1=$2" >/dev/null 2>&1 || {
|
|
# echo "ERROR: gpioset failed on $CHIP line $1=$2" >&2
|
|
# exit 1
|
|
# }
|
|
#}
|
|
|
|
SET_FOR_USEC() {
|
|
# $1=line $2=value $3=usec
|
|
/usr/sbin/gpioset --mode=time --usec "$3" "$CHIP" "$1=$2" >/dev/null 2>&1 || {
|
|
echo "ERROR: gpioset failed on $CHIP line $1=$2" >&2
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
SET_FOR_SEC() {
|
|
# $1=line $2=value $3=sec (integer)
|
|
/usr/sbin/gpioset --mode=time --sec "$3" "$CHIP" "$1=$2" >/dev/null 2>&1 || {
|
|
echo "ERROR: gpioset failed on $CHIP line $1=$2" >&2
|
|
exit 1
|
|
}
|
|
}
|
|
reset() {
|
|
echo "CoreCell power enable through ${CHIP} line ${SX1302_POWER_EN_PIN}..."
|
|
echo "CoreCell reset through ${CHIP} line ${SX1302_RESET_PIN}..."
|
|
echo "SX1261 reset through ${CHIP} line ${SX1261_RESET_PIN}..."
|
|
echo "ADC reset through ${CHIP} line ${AD5338R_RESET_PIN}..."
|
|
|
|
# # Power enable ON (hold long enough to cover the reset sequence)
|
|
# SET_HOLD "$SX1302_POWER_EN_PIN" 1
|
|
# WAIT
|
|
#
|
|
# # SX1302 reset pulse (many designs are active-low; this matches Semtech script)
|
|
# SET_FOR "$SX1302_RESET_PIN" 1 0.10
|
|
# SET_FOR "$SX1302_RESET_PIN" 0 0.10
|
|
# WAIT
|
|
#
|
|
# # SX1261 reset pulse
|
|
# SET_FOR "$SX1261_RESET_PIN" 0 0.10
|
|
# SET_FOR "$SX1261_RESET_PIN" 1 0.10
|
|
# WAIT
|
|
#
|
|
# # Optional ADC reset pulse (harmless if line is unused, but may error if not present)
|
|
# # If this line causes failure on your HAT, set AD5338R_RESET_PIN to an unused line
|
|
# # or comment these two lines out.
|
|
# SET_FOR "$AD5338R_RESET_PIN" 0 0.10
|
|
# SET_FOR "$AD5338R_RESET_PIN" 1 0.10
|
|
# WAIT
|
|
|
|
#
|
|
# 2/18/26 8:17 AM below replaces above
|
|
#
|
|
# Power enable ON for 1 second (enough to cover reset sequencing)
|
|
SET_FOR_SEC "$SX1302_POWER_EN_PIN" 1 1
|
|
WAIT
|
|
|
|
# SX1302 reset pulse (100ms high then 100ms low)
|
|
SET_FOR_USEC "$SX1302_RESET_PIN" 1 100000
|
|
SET_FOR_USEC "$SX1302_RESET_PIN" 0 100000
|
|
WAIT
|
|
|
|
# SX1261 reset pulse (100ms low then 100ms high)
|
|
SET_FOR_USEC "$SX1261_RESET_PIN" 0 100000
|
|
SET_FOR_USEC "$SX1261_RESET_PIN" 1 100000
|
|
WAIT
|
|
|
|
# ADC reset pulse (often unused on HATs; safe to try, but you can comment out if needed)
|
|
SET_FOR_USEC "$AD5338R_RESET_PIN" 0 100000
|
|
SET_FOR_USEC "$AD5338R_RESET_PIN" 1 100000
|
|
WAIT
|
|
|
|
}
|
|
|
|
case "${1:-}" in
|
|
start) reset ;;
|
|
stop) reset ;;
|
|
*)
|
|
echo "Usage: $0 {start|stop}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|