[gelöst] Power Off in C

  • Hi !


    Ich habe ein etwas seltsames Verhalten:


    Wenn ich diesen C code benutze um brutal ein Power off zu triggern funktioniert das bei laufendem Linux, aber nicht wenn das binary beim booten als init ersatz direkt vom kernel gestartet wird:



    Ein reboot funktioniert aber sehr wohl:


    Code
    int do_reboot() 
    { 
    sync(); 
    fprintf(stderr,"nfiwrite is rebooting ...\n");
    sleep(2); 
    sync(); 
    sleep(2); 
    reboot(RB_AUTOBOOT); 
    return 0; 
    }


    /sys /proc und /dev mountet sich das Binary auch, weil es vorher noch schnell ein nfi image flasht, nur wenn es fertig ist sollte es eben die box abdrehen, im bootlog kommt aber nur das:

    Code
    p, li { white-space: pre-wrap; }
    
    
    nfiwrite is halting ...
    [   80.784000] sd 0:0:0:0: [sda] Synchronizing SCSI cache
    [   80.785000] sd 0:0:0:0: [sda] Stopping disk
    [   81.225000] Power down.


    Die hardddisk wird dabei auch abgedreht so wie es da steht und der kernel kriegt auch das Power Down - nur macht er es eben nicht, box und OLED bleiben an.


    Macht man den selben code bei laufendem linux/enigma2 oder auch mit einem poweroff Befehl in telnet dann wird wirklich abgedreht so wie es sein sollte.


    Scheinbar bin ich zu blöde zu erkennen was ich da falsch mache - Hilfe ist also willkommen.


    LG
    gutemine

    2 Mal editiert, zuletzt von Lost in Translation ()

  • Ernsthaft ?


    Das erklärt natürlich das Verhalten, aber wenn ich mir das modules.dep ansehe braucht der praktisch alles an Treibern was sonst noch da ist. Wäre zwar nett, weil dann kann ich auch am TV und am LCD nette Fortschrittsanzeige machen während geflasht wird, aber ich habe wenig Lust auf einen simplen Recovery Stick nur zum Flashen das alles auch noch mit drauf zu packen. Ich kann das zwar theoretisch sogar machen, weil ich auch eigenes modprobe.c als routine fürs laden habe die ich nur dazu machen würde, aber trotzdem ist es ein Overkill. Und sobald ich die Treiber aus dem Flash brauche oder aus dem Image holen muss wo sie dann evt. nicht zum Kernel passen ist es kein echtes Recovery wo nur der SSL noch leben muss.


    Und der bcm*.ko macht letztenlich wahrscheinlich ja auch nur ein böses ioctl irgendwohin in ein Register um die box ganz abzudrehen, kann man das nicht auch ohne den Treiber durchführen ?


    Oder hat noch wer eine idee wie man dem user mit dem nackten Linux Kernel die Info zukommen lassen kann das man mit Flashen fertig ist ?


    Die bootlogo.elf kann ich ja sobald der Kernel läuft auch nicht benutzen um nochmals anderes Logo anzuzeigen.

    3 Mal editiert, zuletzt von Lost in Translation ()

    • Offizieller Beitrag

    Hi,


    leider gibts da kein poweroff was für alle boxen funktioniert.. also da wird je nach box was anderes gemacht. Das ist schon hardware spezifisch.


    Also der Treiber verbiegt das kernel poweroff.. so dass wenn der kernel dann am ende poweroff aufruft er dann die hw spezifische variante aufruft.


    Aber wie gesagt.. das ist bei jeder Box anders.. und aus dem Userspace kann man das auch nicht machen.


    Also am besten einfach ne Meldung ausgeben, dass der user dann halt die box einmal abschalten soll. Also richtig.


    cu

  • Ja aber damit ich so eine schöne Meldung ausgeben kann muss ich auch Treiber laden sonst kann ich nichts in den Framebuffer pinseln und dann kann ich gleich auch das Power Off machen.


    Nur Ihr wisst schliesslich wie man da direkt Adios ... oder die IP Adresse bei der 500hd rausschreibt :smiling_face:


    Also kann ich wohl nur ins ursprüngliche recovery bootlogo reinschreiben: 5min warten bis geflast und und dann box einfach abdrehen und stick abstecken.


    Manchmal muss man halt auch Dinge aktzeptieren wie sie sind, ich habe ja auch deswegen gefragt damit ich nicht weiter was probiere was so gar nicht geht.


    Danke fürs Feedback.


    Ich hatte halt gehofft das es sowas wie z.B. über den Frontprozessor bei der 7025 gibt:


    PS: wenn mir trotzdem was einfällt rühre ich mich noch.

    Einmal editiert, zuletzt von Lost in Translation ()

  • Doch, eine saublöde Frage hätte ich noch - wäre es möglich die ganzen boxspezifischen Module von Broadcom uns direkt in den kernel zu compilieren ?


    Wobei das auch nur wieder ihr könnt da wir mit den *.ko leben müssen :loudly_crying_face:


    Weil mein recovery kernel bootet ja von FAT, Größenprobleme hätte ich da also mit dem Kernel keine ... und es müsste auch flotter booten - gerade bei den Boxen mit 1GB Flash wäre das vielleicht auch so mal einen Versuch wert :grinning_squinting_face:


    Ein anderer möglicher Workaround wäre mir pro Box die Module selber in in ein initramfs zu machen und das dann in einen speziellen Kernel zu packen bzw. mein initramfs patch kann auch das chainen von mehreren initramfs (psst - nicht weitersagen) womit ich statt dem ganzen /lib/modules nur ein weiteres File pro Box benötigen würde.


    Na ja ich probiere halt erstmal den einfachen Fall aus den Inhalt vom dreambox-dvb-modules ipk auch noch auf den Stick zu packen, dann muss ich mir halt auch noch mit depmod -b dafür ein modules.dep erstellen und dann kann meine modprobe routine damit hoffentlich was anfangen.


    Mühsam, sehr mühsam, aber wenn das geht kann ich es dann auch in ein initrd=/initramfs.cpio.gz packen :grinning_squinting_face:

    6 Mal editiert, zuletzt von Lost in Translation ()

  • leider reichen die dreambox-dvb-modules noch nicht aus damit der bcm7405 lädt :loudly_crying_face:

    Einmal editiert, zuletzt von Lost in Translation ()

  • also habe ich jetzt auch noch die ko files von folgenden ipks dazu gepackt:


    kernel-module-snd-pcm
    kernel-module-snd-timer
    kernel-module-snd-page-alloc
    kernel-module-stv-0299


    Jetzt macht der code das was er sollte - siehe Bootlog:


    Code
    modprobing done ...
    nfiwrite is halting ...
    [   40.737000] sd 0:0:0:0: [sdb] Synchronizing SCSI cache
    [   40.738000] sd 0:0:0:0: [sdb] Stopping disk
    [   41.178000] Power down.
    [   41.179000] fp_power_off


    Mühsam, sehr mühsam nur um dem fp was mitzuteilen und eine zeile mehr im bootlog zu haben :grinning_squinting_face:


    Aber jetzt dreht sich die box nach dem Flashen ab, ich habe daher ein [gelöst] im Threadtitel dazu gemacht.


    Und nachdem jetzt sowieso alles an Treibern geladen wurde vom FAT des sticks kann ich jetzt natürlich wenn ich will auch Output machen so viel Ihr wollt :thumbs_up:


    Danke für den Tipp!


    EDIT: OK, auch Framebuffer output geht jetzt am Schluss des Flashens, insofern denke ich lassen wir das mal so und ich spiele mich mit dem initramfs für die Module mal wenn ich mal wieder Lust habe, weil das war jetzt erstmals genug Extraarbeit, weil auch wenn ich den meisten code schon für andere sachen gemacht hatte dauert es bis das alles auch richtig zusammengehängt ist und auch auf diesem niedrigen level als init binary überhaupt funktioniert.


    LG
    gutemine

    7 Mal editiert, zuletzt von Lost in Translation ()