FritzBox, speziell 7270, die LEDs können ja auch rot leuchten!

regn

Neuer User
Mitglied seit
14 Mai 2008
Beiträge
89
Punkte für Reaktionen
0
Punkte
6
Unmittelbar beim Einstecken des Netzteils, wenn also adam2 arbeitet, steuert dieser die LEDs kurz an.
Normalerweise alle kurz grün - laut offizieller Doku von AVM können die ja nur grün.
Aber die können ja auch rot, und mir scheint, daß adam2 damit so einiges erzählen will.
Möglicherweise checkt er ja die einzelnen HW-Komponenten, zumindest aber wohl den Ethernet-controller (ist das der kleinere der beiden Infineon-chips?), da er ja einen FTP-server startet.
Ist irgendwo zu erfahren, was einzelne rote LEDs zu diesem Zeitpunkt bedeuten - auch wehavemorefun gibt da nichts dazu her.
 
Soweit ich weiß leuchten nicht die "normalen" sonst grünen LEDs rot sondern 1-3 interne exta LEDs. Die sitzen aber auf der Platine irgendwo und leuchte nur durch. Man kann sich nicht beschränken.
 
Zuletzt bearbeitet:
Moin

Meine 7360SL (auch die 7270v2) macht kurz vor dem Reboot:
Power LED = Rot, Info LED = Rot und alle Anderen Grün.

Zumindest bei der Info-LED weiss ich wie es geht:
led-ctrl filesystem_mount_failure
(60 Sekunden langes rotes hektisches blinken)
Benutze ich um eingehende Telefonate zu signalisieren.

Wie die rote Power-LED anzusteuern ist weiß ich leider nicht. Diese Info hätte ich aber gerne. ;)

PS: Das sind keine "durchscheinenden" LAN oder Telefon LEDs auf der Platine.

Die LED Codes findest du auf router-faq
Zur 7360SL steht da aber auch nur:
Info blinkt rot Fehler. Grund steht auf der Übersichtsseite des FRITZ!Box Menüs.

Da find ich "led-ctrl filesystem_mount_failure" aussagekräftiger. ;)
 
Zuletzt bearbeitet:
Die router-faq kenne ich, aber da wird ja nur auf die grünen Signale eingegangen. Und wie gesagt, ich meinte das Aufblinken der LEDs unmittelbar beim Einstecken des Netzteils, das kommt definitiv vom Adam2, nicht von FritzOS.
@koyaanisqatsi, meintest Du kurz vor dem Reboot oder beim Boot?
Ich habe hier eine 7270 V3, die beim Einschalten rt-gn-gn-gn-rt zeigt und eine 7270 V2, die 5x rot zeigt, bevor dann FritzOS geladen wird und die Power/DSL blinkt
 
Hm, schwer zu sagen, gefühlt vor dem Reboot, kann aber auch bei ADAM2, also beim Start sein.
 
Meine 7390 (die da) macht beim Boot (unmittelbar nach dem "Einschalten") kurzfristig alle LEDs an. Bei der 7390 sind Power und Info Doppel-LEDs (rot und grün), die anderen Einfach-LEDs (nur grün). Dass es alle sind, erkennt man nur, wenn die FB offen (gehäuselos) ist, ansonsten überstrahlen die roten LEDs die grünen.

Welche LED hängt woran (bei der 7390)?
Code:
GPIO|Name     |Farbe
----+---------+-----
 22 |Info     |grün
----+---------+-----
 23 |Info     |rot
----+---------+-----
 24 |Power    |grün
----+---------+-----
 25 |Power    |rot
----+---------+-----
 26 |Festnetz |grün
----+---------+-----
 27 |WLAN     |grün
----+---------+-----
 28 |Internet |grün
----+---------+-----

GPIO = 0: LED an
GPIO = 1: LED aus

G., -#####o:
 
Moin

OK, scolopender, wie würdest du also die rote PowerLED zum Leuchten bringen?
 
koyaanisqatsi schrieb:
... wie würdest du also ...
Wenn ich mal richtig Zeit habe, kann ich mich ja mal damit befassen.

Ansonsten: siehe #4. Die damit ausgegeben Liste ist (bei der 7390 zweispaltig) elend lang. Vielleicht ist da etwas für Dich dabei.

G., -#####o:
 
Schon OK, irgendwie wusste ich das so eine Antwort kommt.
 
Ich habe meine 7390 mit einem Anschluss für die serielle Konsole nachgerüstet. Wenn ich darüber den Bootloader ("Eva-AVM") anhalte, kann ich die LED mit dem Kommand gpio 25 0 ein- und mit gpio 25 1 ausschalten. Aber das ist sicher nicht das, was Du wissen willst - und mehr weiß ich momentan auch nicht, sonst hätte ich es nämlich schon hingeschrieben. :mad:

G., -#####o:
 
Schon OK, irgendwie wusste ich das so eine Antwort kommt.
Ein kleines Kernel-Modul, das für eine 7390 die folgende Funktion aus den Kernel-Sourcen
Code:
int ikan_gpio_out_bit(unsigned int gpio_pin, int value) {
    unsigned long flags;

    /*--- printk("[ikan_gpio_out_bit] gpio=%u value=%u\n", gpio_pin, value); ---*/

    if(gpio_pin > 31) {
        printk("[GPIO] invallid gpio pin %d\n", gpio_pin);
        return(-1);
    }


    spin_lock_irqsave(&ikan_gpio_spinlock, flags);
    VX180_GPIO_OUTPUT(gpio_pin, value);
    spin_unlock_irqrestore(&ikan_gpio_spinlock, flags);

    return(0);
}
aufruft, dürfte die einfachste und sicherste Art und Weise sein.

Dann das Modul noch mit einem Zugang über procfs versehen und schon kann man die LEDs ein- und ausschalten, allerdings ohne Rücksicht auf die Einstellungen in der AVM-Firmware und auch ohne deren Funktionen zur Rückkehr zum vorherigen Zustand und zur Abfrage des aktuellen Zustands. Wenn man allerdings einen eigenen Kernel einsetzt und die o.a. Funktion um ein "Gedächtnis" erweitert (AVM macht das weiter unten in der Kette), könnte man sicherlich auch das Problem mit der Abfrage lösen, solange alle anderen auch nur über die o.a. Funktion zugreifen.

Wenn man es ganz q&d machen will (der Spinlock ist für LEDs sicherlich nicht nötig, eher für die Behandlung von IRQs in SMP-Umgebungen), kann man auch direkt
Code:
#define VX180_GPIO_MEMORY_BASE             (0x19000000)
...
#define VX180_GPIO_FLAG_BASE(a)        ((a) == 0 ? KSEG1ADDR(0x40004 + VX180_GPIO_MEMORY_BASE) : KSEG1ADDR(0xB0004 + VX180_GPIO_MEMORY_BASE))
union __vx180_gpio_flag {
    struct _vx180_gpio_outputflag {
        /*--- Writing ?one? to the lower half Word address (0x190x0004) clears the bit ---*/
        /*--- ? Writing ?one? to the upper half Word address (0x190x0006) sets the bit ---*/
        volatile unsigned short flag_clr;
        volatile unsigned short flag_set;
    } outputBits;
    struct _vx180_gpio_flag {
        /*--- If GPIO[n] is in the input direction, this register ---*/
        /*--- stores the value transmitted to GPIO[n] by an ---*/
        /*--- external Source ---*/
        /*--- If GPIO[n] is in the output direction, this register ---*/
        /*--- to stores the value transmitted by Fusiv Vx180 to ---*/
        /*--- GPIO[n]. ---*/
        volatile unsigned short flag;
        unsigned short reserved;
    } Bits;
    volatile unsigned int Reg;
};
...
static inline void VX180_GPIO_OUTPUT(unsigned int gpio, unsigned int set) {
    union __vx180_gpio_flag *pflag = (union __vx180_gpio_flag *)VX180_GPIO_FLAG_BASE(gpio < 16 ? 0 : 1);
    if(set) {
        pflag->outputBits.flag_set = 1 << (gpio % 16);
    } else {
        pflag->outputBits.flag_clr = 1 << (gpio % 16);
    }
}
benutzen ... oder, wenn man ein Programm zum freien Schreiben in den Adressraum des Prozessors hat (die GPIO-Register müßten nach meinem Verständnis "memory mapped" sein), die Adresse ausrechnen (s.o.) und dann dorthin schreiben.

Die Adresse ergibt sich aus 0x19000000 (GPIO-Base) + 0xB0004 (die Pins > 16) = 0x190B0004. Dorthin wäre dann der Wert 0x02000100 (0x0100 nach 0x190B0004 zum Löschen von grün bei der Power-LED und 0x0200 zum Setzen von rot bei der LED, das ganze bei Big-Endian dann richtig zusammengesetzt - wenn ich mich nicht vertan habe) zu schreiben. Wenn es (ich kenne die Logik dort nicht wirklich) nicht möglich ist, mit einer Schreiboperation zu löschen und zu setzen, muß man es eben auf zwei aufteilen.

Edit: Natürlich stimmt der Wert 0x02000100 wohl nicht. Beim Speichern von 32-Bit-Werten in BE (B[SUB]0[/SUB]B[SUB]1[/SUB]B[SUB]2[/SUB]B[SUB]3[/SUB]) geht B[SUB]0[/SUB] nach 0x190B0004, B[SUB]1[/SUB] nach 0x190B0005, B[SUB]2[/SUB] nach 0x190B0006 und B[SUB]3[/SUB] nach 0x190B0007. Unter 0x190B0004 und 0x190B0005 sind die Clear-Bits erreichbar, also gehört der 0x0100-Wert schon mal in B[SUB]0[/SUB] und B[SUB]1[/SUB]. Und theoretisch auch da noch innerhalb der 16 Bit des Short-Wertes die einzelnen Bytes getauscht ... damit wäre dann wohl 0x00010002 nach 0x190B0004 der richtige Wert, wenn ich die C-Union-Struct-long-short-Kombination endlich richtig auseinander gepflückt habe. Wo sind die Microcontroller-Fans ?

Edit2: Rein dem Quelltext nach zu urteilen, müßte eigentlich eine Busybox mit "devmem"-Applet alles richtig machen, um auf "physikalische" Adressen zugreifen zu können (inkl. Mapping). Wenn man dann noch die etwas ungewöhnliche Angabe der Größe der zu lesenden/schreibenden Daten in "Bits" verstanden hat, müßte man damit eigentlich die o.a. Aktionen ausführen können. Allerdings bitte unbedingt beachten, daß an den GPIO-Pins noch diverse andere Signale, von "Enable" bis "Write Protect" für den NAND-Flash, die Buttons (als INPUT-Pins) und auch das Reset-Signal für den DECT-FPGA hängen. Also nur sehr vorsichtig damit umgehen. Allerdings sollte ein lesender Zugriff auf 0x190B0004 in 32 Bit Größe schon Aufschluß über die korrekte Bit-Zuordnung bringen, wenn man dabei die gedrückte DECT-Taste (Pin 29) und die WLAN-Taste (Pin 31) versucht zu finden.

gpio 25 0 ein- und mit gpio 25 1 ausschalten.
Wenn das kein Schreibfehler ist, wird irgendwie (vermutlich durch die Schaltung) das GPIO-Signal invertiert ? Dann stimmt natürlich der o.a. Wert erst recht nicht. Invertiert müßte es dann wohl 0x00020001 sein (Pin 24 - Power grün - auf 1 für "aus" und Pin 25 - Power rot - auf 0 für "ein") ? Der korrekte Wert für "ein"/"aus" geht aus den Kernel-Quellen leider nicht mehr hervor, seit der größte Teil der Logik aus dem LED-Module in die libled2 und libenwnled, samt led-ctrl, gewandert ist.
 
Zuletzt bearbeitet:
Wow, auch wenn es meinen Horizont überschreitet, Dankeschön für den Beitrag.
Nur möcht ich für die Spielerei nicht unbedingt ein C Programm crosskompilieren. :)

Hab eher an einen Trick oder so gedacht.

Beispiel:
Bei einer 7113 hast du noch mit echo gearbeitet.
(Unterschied: 7113 = /dev/new_led)

Danach kam led-ctl, ich mein jetzt bei den Boxen die noch nicht EoS, EoL sind.

Ja, ich kenne auch led-ctl -l, aber eben die Eventzuordnung für die rote PowerLED nicht.
Und das schon, solang ich die 7360SL und 7270 besitze.
Hab die Hoffnung auch schon (fast) aufgegeben.

Den aktuellen Status setzen...
1. Radikal alle LED Events auf aus setzen (nur die für LEDs, nicht Tasten).
2. Nacheinander mit ctlmgr_ctl r prüfen und die Events wieder setzen.
...fertig.

@scolopender: Wenn, wie der TE meint...
"Unmittelbar beim Einstecken des Netzteils, wenn also adam2 arbeitet, steuert dieser die LEDs kurz an."
...wäre es dann möglich anhand deiner Konsole den aktuellen Status herauszubekommen?
 
Zuletzt bearbeitet:
PeterPawn schrieb:
... wird irgendwie (vermutlich durch die Schaltung) das GPIO-Signal invertiert ?
Nein. Die LED samt Strombegrenzungswiderstand ist zwischen den GPIO-Pin und der Betriebsspannung (3.3V) geschaltet. Damit Strom fließt und die LED leuchtet, muss der GPIO-Pin auf Low-Pegel (~0.0V) schalten, das tut er mit der 0. Mit der 1 gibt der GPIO-Pin einen High-Pegel (~3.3V) ab -> LED aus.

G., -#####o:
 
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)]
 
Zuletzt bearbeitet:
Meine BusyBox v1.21.1 hat nicht nur devmem sondern auch usleep. ;)
Damit mach ich eine Stroboskoplampe aus der Fritz!Box.

Nur, ich hab keine 7390. Soll ich es trotzdem wagen?
 
Nur, ich hab keine 7390. Soll ich es trotzdem wagen?
Keinesfalls, siehe meine Ergänzung im letzten Beitrag.

Die GPIO-Pin-Belegungen sind garantiert andere und die 7360 hat einen anderen Prozessor. Man braucht schon die passenden Kernel-Quellen, um da die passenden Daten zu extrahieren.
 
Zuletzt bearbeitet:
Danke. Ich dachte halt, sie hängt zwischen Pin und Masse ...
Ein Anschluss zwischen Pin und Vcc ist eher üblich. Speziell funktioniert das auch mit einem einzelnen NPN Transistor (auch als Bestandteil eines Logik ICs), der dabei tatsächlich als Inverter arbeitet. Die GPIO Ausgänge sind vermutlich symmetrisch und würden auch anders herum funktionieren, aber vermutlich bleibt man eher bei den alten Gewohnheiten.
Zumindest bei den Buttons sollte es "ordentlich" zugehen ... low -> nicht gedrückt, high -> gedrückt. ;)
Auch darauf würde ich nicht wetten. Oft wird hierfür ein Taster zwischen Masse und einen Pull-Up Widerstand geschaltet, so dass der Pegel Low ist, wenn der Taster betätigt wird. Zumindest ist es gängig, ein Reset Signal Low-Aktiv zu verwenden.
 
Auch darauf würde ich nicht wetten.
Ok, die Polarität eines Input-Pins läßt sich ja auch noch umschalten. Ich meinte damit mehr, daß "am Schluß" dann im Register eine 1 für die gedrückte Taste erscheinen sollte, wenn man avm_event_pushbutton.c Glauben schenken will. Im Gegensatz zur "invertierten Logik" mit 1->aus und 0->an bei den LEDs.

Ansonsten ist die Anschaltung der LEDs gegen +Vcc und mit Schalttransistor mir schon geläufig, besonders der daraus resultierende Effekt, daß nicht der komplette Strom der LED über den GPIO-Pin gehen muß und der Transistor gleich als Leitungstreiber herhalten kann. Auch die "Initialisierung" von Input-Pins mit PullUp- oder PullDown-Widerstand für definierten Pegel/Zustand ist (elektronisch) klar, sogar ggf. noch ein Entprellen von Tastern in Hardware (macht man das heute noch ?). Ich bin zwar etwas vom "Basteln" weg, aber habe glücklicherweise noch nicht alles vergessen. ;)

Hast Du eigentlich eine Ahnung, wie bei der 7270 (hw145 + hw139) die LEDs angesteuert werden ? Ich finde beim besten Willen keine Zuordnung zu GPIO-Pins in den UR8-Quellen. Den Rest zum UR8-GPIO (Base 0x08510900, In bei +0, Out bei +4 für die ersten 32 Pins, ansonsten nochmal 0x40 Byte weiter für die Pins von 32 bis 44 und keine Set-/Reset-Register, sondern klassisches Read/Change/Write) habe ich gefunden, aber so langsam kommen mir erste Zweifel, ob dort überhaupt simple GPIO-Pins verwendet werden für die LEDs.
 
Zuletzt bearbeitet:
Ich weiß nicht, wie die LEDs angesteuert werden, aber ich würde strace auf das Programm led-ctrl laufen lassen. Irgendwie muss das Programm ja mit dem Kernel kommunizieren, um die LEDs zu steuern. Von da aus sollte sich die passende Stelle im Kernel finden lassen.
 

Zurzeit aktive Besucher

Neueste Beiträge

Statistik des Forums

Themen
244,878
Beiträge
2,220,027
Mitglieder
371,604
Neuestes Mitglied
broekar
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.

IPPF im Überblick

Neueste Beiträge