Die LED samt Strombegrenzungswiderstand ist zwischen den GPIO-Pin und der Betriebsspannung (3.3V) geschaltet.
Danke. Ich dachte halt, sie hängt zwischen Pin und Masse ...
Zumindest bei den Buttons sollte es "ordentlich" zugehen ... low -> nicht gedrückt, high -> gedrückt.
wäre es dann möglich anhand deiner Konsole den aktuellen Status herauszubekommen?
Nein.
GPIO-Pins sind - m.W. - entweder Input oder Output, einen Output-Pin abzufragen bringt nichts. Will man den "aktuellen Status" eines Output-Pins wissen, muß man ihn sich eben beim Setzen merken.
Edit: Korrigiere mich ... offenbar wird der letzte Status des Pins doch bereitgestellt. Damit läßt sich der aktuelle Zustand der LEDs mit "busybox devmem" abfragen. Natürlich nur als "Momentaufnahme", also an oder aus ... kein Blinken, keine Blinkfrequenz. Das geht dann nur durch wiederholte Abfrage (mit der doppelten maximalen Blinkfrequenz für hinreichend genaue Ergebnisse -> Abtasttheorem
).
Ein schneller Entwurf eines Scripts zum Auslesen des aktuellen LED-Zustands einer 7390 (und nur für diese !!!):
Code:
#! /bin/sh
#
# usage: get_led_state <ledname>
# returns 0 for 'off' and 1 for 'on', 127 in case of an error
#
if [ ${#1} -eq 0 ]; then
echo "Missing LED name." 1>&2
exit 127
fi
led=$1
leds="info/22 info_red/23 power/24 power_red/25 festnetz/26 wlan/27 internet/28"
set -- $leds
unset pin
while [ ${#1} -gt 0 ]; do
if [ "${1%/*}" == "$led" ]; then
pin=${1##*/}
break
fi
shift
done
if [ ${#pin} -eq 0 ]; then
echo "Unknown LED name '$led'." 1>&2
exit 127
fi
dm="busybox devmem"
$dm 2>&1 | grep -q "applet not found"
if [ $? -eq 0 ]; then
echo "Please check your busybox binary and it's 'devmem' applet support." 1>&2
exit 127
fi
ma=$(( 0x190B0004 ))
sz=16
msk=$(( 1 << ( $pin - 16 ) ))
val=$($dm $ma $sz)
if [ "${val:0:2}" != "0x" -o ${#val} -ne 6 ]; then
echo "Unexpected value '$val' returned from 'devmem'." 1>&2
exit 127
fi
v=$(( $val & $msk ))
if [ $v -eq 0 ]; then
r=1
else
r=0
fi
exit $r
Allerdings braucht es ein busybox-Binary mit dem Applet 'devmem'.
[EDIT(n)] Gerade probiert: Durch das Schreiben passender Werte lassen sich die LEDs auch ein- und ausschalten. Damit braucht es nur ein passendes busybox-Binary, um die LEDs sowohl abzufragen als auch zu setzen. Die passende Busybox läßt sich ja problemlos über Freetz kompilieren und irgendwie auf die Box bringen.
Das Ein- und Ausschalten der LEDs ist natürlich ebenfalls nur eine Momentaufnahme, d.h. läßt die AVM-Firmware eine LED blinken, ändert sich nur der aktuelle Zustand. Alles andere, was dann timer-gesteuert als nächstes von der Firmware kommt, ignoriert die zwischenzeitlichen Änderungen.
@scolopender: Kannst Du verifizieren, ob es sich bei den "bunten" LEDs (sicherlich die SMD-Variante, oder ?) um zwei getrennte Bauteile oder eine Duo-LED handelt ?
Sie lassen sich (bei mir, bei geschlossenem Gehäuse schlecht zu sehen) unabhängig voneinander einschalten und ergeben dann das hinlänglich bekannte Orange. Ich bin mir nur nicht sicher, ob sich das Bauteil (wenn es eine Duo-LED ist) nicht beim Dauerbetrieb beider Farben zu stark erwärmt, wegen des erhöhten Stromflusses.
Und das Ein-/Ausschalten funktioniert dann so:
Code:
#! /bin/sh
#
# usage: set_led <ledname> <0|1>
# switch the specified led to 'on' (1) or 'off' (0)
# returns 127 in case of an error
#
if [ ${#1} -eq 0 ]; then
echo "Missing LED name." 1>&2
exit 127
fi
if [ ${#2} -eq 0 ]; then
echo "Missing new led state." 1>&2
exit 127
fi
if [ $2 -ne 0 -a $2 -ne 1 ]; then
echo "Invalid led state '$2'." 1>&2
exit 127
fi
led=$1
state=$2
leds="info/22 info_red/23 power/24 power_red/25 festnetz/26 wlan/27 internet/28"
set -- $leds
unset pin
while [ ${#1} -gt 0 ]; do
if [ "${1%/*}" == "$led" ]; then
pin=${1##*/}
break
fi
shift
done
if [ ${#pin} -eq 0 ]; then
echo "Unknown LED name '$led'." 1>&2
exit 127
fi
dm="busybox devmem"
$dm 2>&1 | grep -q "applet not found"
if [ $? -eq 0 ]; then
echo "Please check your busybox binary and it's 'devmem' applet support." 1>&2
exit 127
fi
ma=$(( 0x190B0004 ))
sz=16
msk=$(( 1 << ( $pin - 16 ) ))
test $state -eq 0 && let ma+=2
$dm $ma $sz $msk
exit 0
Das Schreiben eines 32-Bit-Wertes scheint nicht zu funktionieren, offenbar wird da noch eine Adressleitung zwischen Vx180 und GPIO gemappt.
Will man also die Info-LED abwechselnd (~ 1 Hz + Dauer der Kommandos) rot und grün blinken lassen, ginge das z.B. so (ohne jede Prüfung auf 'devmem'):
Code:
#! /bin/sh
dm="busybox devmem"
a1=$(( 0x190B0004 ))
let a2=a1+2
g=64
r=128
while true; do
$dm $a2 16 $r
$dm $a1 16 $g
sleep 1
$dm $a2 16 $g
$dm $a1 16 $r
sleep 1
done
Dabei kommt einem dann auch die Firmware nur unwesentlich ins Gehege (z.B. bei hektischem Blinken mit > 2Hz). Wer es ordentlich liebt, sorgt im vorstehenden Script noch für einen sauberen Ausstieg und eine definierte Anzeige der LEDs.
@koy:
Ist zwar kein "echo" und braucht eine bessere Busybox, aber kann ja auch ab und an nützlich sein.
Und das schon, solang ich die 7360SL und 7270 besitze.
Hab die Hoffnung auch schon (fast) aufgegeben.
Das hab ich jetzt erst richtig gesehen. Wenn die beiden Modelle auch mit "memory mapped"-Registern für die GPIO-Pins arbeiten, mußt Du nur die korrekten Daten zusammensuchen und kannst das problemlos adaptieren. Mangels passender Boxen passe ich da dann aber, ich könnte ja ohnehin nicht testen.
[/EDIT(n)]