Saturday, August 25, 2007

linux@dbox2: implemented AVIA ENX reset

Since this is the first weekend after returning from vacation, i thought i'd turn to the tuxbox project again. This time i experimented with my Sagem dbox2 instead of my dreambox 500.
I was finally fed up with the joy of reverse-engineered hardware: sometimes, if you do strange things to the AVIA ENX chip, it will somehow lock up. Unfortunately, there is no way to reset it, short of rebooting the box. Looking at the code i found out that there actually is a reset function for the chip, but it's only used at module load and unload. Unfortunately you cannot unload the module since lots of other stuff depends on it, so rebooting the box is actually faster than trying to reload the module.

I went for the quick and very dirty way and exported a file in /proc which, if something is echoed into it, performs a chip reset of the AVIA ENX chip.

The diff is quick, dirty, and trivial. But it works for me. The important parts of it are here:
--- a/driver/ext/aviaEXT.c      21 May 2006 23:01:10 -0000
+++ b/driver/ext/aviaEXT.c 25 Aug 2007 12:53:13 -0000
@@ -27,6 +27,7 @@
#include <linux/module.h>
#include <linux/devfs_fs_kernel.h>
#include <asm/uaccess.h>
+#include <linux/proc_fs.h>

#include "avia_av.h"
#include <dbox/aviaEXT.h>
@@ -86,6 +87,14 @@ static struct file_operations aviaEXT_fo
.ioctl = aviaEXT_ioctl
};

+extern void avia_gt_dmx_risc_reset(int);
+static int avia_av_proc_write_avia_reset(struct file *f, const char *b, unsigned long c, void *d)
+{
+ printk("calling avia_gt_dmx_risc_reset(1)\n");
+ avia_gt_dmx_risc_reset(1);
+ return c;
+}
+
static int __init aviaEXT_init(void)
{ if (!(devfs_h = devfs_register(NULL,"dbox/aviaEXT", DEVFS_FL_DEFAULT, 0, 0,
@@ -93,6 +102,18 @@
printk(KERN_ERR "aviaEXT: could not register with devfs.\n");
return -EIO;
}
+
+ struct proc_dir_entry *proc_bus_avia_reset;
+
+ proc_bus_avia_reset = create_proc_entry("avia_reset", 0200, proc_bus);
+ if (!proc_bus_avia_reset) {
+ printk("avia_av_proc: could not create /proc/bus/avia_reset");
+ return -ENOENT;
+ }
+
+ proc_bus_avia_reset->write_proc = avia_av_proc_write_avia_reset;
+ proc_bus_avia_reset->owner = THIS_MODULE;
+
return 0;
}


Of course you need to EXPORT_SYMBOL(avia_gt_dmx_risc_reset); at the appropriate place.

Combine this interface with something like the following:
#!/bin/sh
valold=""
while sleep 1; do
# the "avia" interrupts stop if the chip has crashed
valnew=$(grep avia$ /proc/interrupts)
if [ "$valnew" = "$valold" ]; then
echo "$(date) avia_reset"
echo > /proc/bus/avia_reset
fi
valold="$valnew"
done


It resets the chip automatically, should it crash again while experimenting.

17 comments:

  1. Hallo,

    ich habe gerade bei Dir über den ENX-Reset gelesen. Ich habe selber eine Sagem-"Zwitscher"-Box und würde mich natürlich über eine gute Lösung freuen. Vom Programmieren habe ich aber null Ahnung.

    Habe ich das richtig verstanden, dass der Reset automatisch ausgeführt wird, sobald das Problem auftaucht?

    Wie kann ich denn ausprobieren, ob dein Code mir hilft. Wo muß ich den denn einfügen, bzw. muß das evtl. noch kompiliert werden (wie gesagt: keinen Plan vom Programmieren)?

    Gruß
    Pascal

    ReplyDelete
  2. Im Kernel-Treiber. Aber ohne Programmierkenntnisse wird das vermutlich nichts werden. Auf welchen Kanälen zwitschert sie denn?

    ReplyDelete
  3. Auf fast allen Kanälen...
    Es gibt ein Haufen Leute, die dieses Problem haben und auch schon diverse Ansätze das mit Plugins zu lösen, aber da ist leider noch nichts brauchbares dabei.

    Es gibt z.B. ein Plugin, den Reset manuell mit der Fernbedienung auszulösen. Das funktioniert zwar (wenn man zuschaut), aber ist doch lästig. Bei Aufnahmen, wo man nicht unbedingt anwesesnd ist, hilft das auch nicht weiter.

    Es gibt auch die Möglichkeit, den Reset über einen Timer alle x Sekunden auszulösen, aber meistens hat man dann ein kurzes Zucken im Bild... Und um das Zwitschern ganz auszuschalten, hält man dann das Intervall möglichst klein, z.B. alle 10 Sekunden. Also alle 10 Sekunden eine Zucken im Bild, naja auch nicht so toll...

    ReplyDelete
  4. Hallo seife,

    anscheinend hast Du mit der Interruptkontrolle etwas gefunden, was für sehr viele Leute hilfreich sein könnte. Wenn Du Lust hast kannst Du Dir die Problematik mal genauer ansehen:
    h**p://www.keywelt-board.com/index.php?showtopic=59651

    Vielen Dank

    m

    ReplyDelete
  5. Die Frage ist: tritt es auch bei FTA-Kanälen auf. Ich habe das bisher nur auf einer (meiner) Maschine gesehen, und ich vermute, daß diese einfach gerade stirbt.

    BTW: mein Patch hier gibt dir nichts anderes, als die möglichkeit, den Reset durchzuführen. Also auch nichts anderes, als alle 10 sek. oder bei Bedarf den Reset zu triggern.

    ReplyDelete
  6. Um es ganz deutlich zu sagen: solange mir keiner glaubhaft versichert, daß es auf FTA-Kanälen auch auftritt, werde ich keine weitere Sekunde an dieses Feature verschwenden. Weitere Diskussionen bitte auf http://forum.tuxbox.org/. Danke.

    ReplyDelete
  7. Meines Wissens nach, gibt's das Problem nur, wenn ein Emu aktiv ist, aber ich weiß ja nicht alles.

    Was ist denn mit deiner Box los, daß die das Zeitliche segnen will?

    ReplyDelete
  8. Hi seife.

    Ich kann die glaubhaft versichern, das das auch bei FTA Kanälen passiert.
    Es hat nicht mit einer sterbenden Box zutun, denn dann würde meine seit 2 Jahren sterben. Das Problem tritt auch auf, wenn kein EMU läuft.

    ReplyDelete
  9. HI!
    Of course you need to EXPORT_SYMBOL(avia_gt_dmx_risc_reset); at the appropriate place.

    Wo ist denn bitte die passende Stelle ?

    Gruß sattester

    ReplyDelete
  10. Da kommen die EMU-Parasiten und GPL-Missachter wieder aus Ihren Löchern gekrochen.
    Seife: in den üblichen Hohlkopfboards wird von den Überhauptnixwissern schon wieder eifrig über Deinen Hack diskutiert.
    Alles weitere kannst Dir ja denken...

    ReplyDelete
  11. Ja, das habe ich schon bemerkt :-). Insbesondere ist es deswegen lustig, weil die ja sowieso eine vergleichbare Funktionalität in "ihren" Images drinhaben. Ich hatte auch nach den Quellen für das ominöse avia_gt_proc.o gesucht, um zu probieren ob das bei mir helfen würde, aber nichts gefunden. Ein Image mit diesem Modul drin wollte ich aber auch nicht flashen, also war halt do-it-yourself angesagt.

    Um die Armen nun zu erlösen: Dieser Hack bringt euch auch nicht weiter als euer avia_gt_proc.o, Zumindest glaube ich das nicht.
    Bisher habe ich einen halbwegs glaubwürdigen Hinweis von einem User, daß es bei ihm auch mit FTA zwitschert, aber das können wir beheben, ohne die Situation für die EMU-Nutzer zu verbessern :-)

    ReplyDelete
  12. Ich hab ganz höflich nachgefragt. Der Rest ist mir soweit klar. War meine Frage so böse? Dann bitte ich jetzt ganz höflich um Verzeihung für meinen Fehltritt.

    ReplyDelete
  13. Nein, deine nicht. Aber insgesamt ist es schon lustig, wieviel Interesse so ein kleiner schmutziger Hack hervorruft...
    Egal. Du mußt das Symbol in dem Modul exportieren, in dem es implementiert ist (ich kann dir im Moment wirklich nicht mehr sagen wo, da ich inzwischen eine ganz andere Implementation des Ganzen benutze).

    ReplyDelete
  14. Auch ich hab eine SAGEM Zwitscher Box. Bei mir tritt das Problem auch immer auf. Was meint ihr mit schmutzigen Hack? Ich finde das Linux für die Box einfach nur klasse, man kann damit alles mögliche managen, wirklich super.
    Nur leider tritt nach ner Weile dieses gezwitschere auf.
    Hab das Jack the Grabber Image. Wäre toll, wenn du da irgendwas rausfindest.

    ReplyDelete
  15. " Ich hatte auch nach den Quellen für das ominöse avia_gt_proc.o gesucht Ich hatte auch nach den Quellen für das ominöse avia_gt_proc.o gesucht"

    die liegen noch bei dem Streamboard :P

    ReplyDelete
  16. Streamboard: Ihnen wird der Zutritt zu dieser Seite verwehrt.
    Aber egal, so wichtig ist es mir nun wirklich nicht.

    ReplyDelete