DVB Frontend ioctl FE_SETPROPERTY

  • Kannst du doch.

    Nur du bekommst 0 für Erfolg und ungleich 0 im erfolglosen Fall zurück.

  • Kannst du doch.

    Nur du bekommst 0 für Erfolg und ungleich 0 im erfolglosen Fall zurück.

    Also wenn ich mir dvb_frontend_thread im dvbcore anschaue dann wird da einfach fe->ops.tune oder dvb_frontend_swzigzag(fe) aufgerufen. Ein client-Programm wie der vdr muss dann "ewig" warten oder in einen Timeout reinlaufen... wo ist da sofort 0 oder ungleich 0?


    Im vtuner z.B. verwende ich fe->ops.tune:

    Code
    			if (fe->ops.tune)
    					fe->ops.tune(fe, re_tune, fepriv->tune_mode_flags, &fepriv->delay, &s);
    
    				if (s != fepriv->status && !(fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT)) {
    					dev_dbg(fe->dvb->device, "%s: state changed, adding current state\n", __func__);
    					dvb_frontend_add_event(fe, s);
    					fepriv->status = s;
    				}

    Wie man sieht kann ich da nur einen "geänderten Status" zurückgeben. Und was soll ich da von FE_NONE aus zurückgeben um zu signalisieren das ich den Kanal nicht ausliefern mag? FE_TIMEDOUT? FE_REINIT? :/

  • Indem du die frontend properties per FE_SET_PROPERTY setzt, aber kein DTV_TUNE sendest.

  • Indem du die frontend properties per FE_SET_PROPERTY setzt, aber kein DTV_TUNE sendest.

    Sehe für vtuner keine Möglichkeit mich beim DVBAPI5 FE_SET_PROPERTY einzuklinken.. Also kann ich einen Parametersatz auch nicht "ablehnen". Ist ja wie schon in meinem Beitrag #190 geschrieben nicht vorgesehen das ein Frontend zwar DVBS2 kann aber z.B. Transponder 11493 nicht ausliefern mag. Dazu müsste es sowas wie "ok", "temporary failure" und "not available" als Rückgabe zu FE_SET_PROPERTY geben. Zudem müsste das vom vdr dann auch noch honoriert werden, so wie ich das im vdr Source gelesen habe wird das Frontend auch bei einem Fehler immer wieder nach dem Kanal gefragt...

  • Dazu müsste es sowas wie "ok", "temporary failure" und "not available" als Rückgabe zu FE_SET_PROPERTY geben.

    setze errno auf den passenden dokumentierten Wert und gebe ungleich Null zurück.

    Zudem müsste das vom vdr dann auch noch honoriert werden

    wird es.

  • wird es.

    setze errno auf den passenden dokumentierten Wert und gebe ungleich Null zurück.

    Ich kapiere mit diesen Wortfetzen leider gar nichts von dem was ich ziemlich ausführlich geschildert habe. Seit wann wird errno in einem Kerneltreiber gesetzt? IMHO kann das nur zurückgegeben werden (z.B. als Returnwert eines ioctls). Wo kann ich FE_SET_PROPERTY in einem Kerneltreiber bearbeiten? Bei dtv_property_process_set schonmal garnicht! Wo wird das im vdr honoriert (Sourcecodezeile?) cDvbTuner::SetFrontend liefert nur true oder false zurück, da gibt es kein "unavailable"...

  • "2.4.5. ioctl FE_SET_PROPERTY, FE_GET_PROPERTY

    (..)

    2.4.5.5. Return Value

    On success 0 is returned.

    On error -1 is returned, and the errno variable is set appropriately.

    Generic error codes are described at the Generic Error Codes chapter."


    "

    Generic error codes(lange weitere Liste ........)

    EAGAIN (aka EWOULDBLOCK) The ioctl can’t be handled because the device is in state where it can’t perform it. This could happen for example in case where device is sleeping and ioctl is performed to query statistics. It is also returned when the ioctl would need to wait for an event, but the device was opened in non-blocking mode.
    EBADF The file descriptor is not a valid.
    EBUSY The ioctl can’t be handled because the device is busy. This is typically return while device is streaming, and an ioctl tried to change something that would affect the stream, or would require the usage of a hardware resource that was already allocated. The ioctl must not be retried without performing another action to fix the problem first (typically: stop the stream before retrying).
    EFAULT There was a failure while copying data from/to userspace, probably caused by an invalid pointer reference.
    EINVAL One or more of the ioctl parameters are invalid or out of the allowed range. This is a widely used error code. See the individual ioctl requests for specific causes.

    "

  • wirbel: Ja ok dann hast Du es nicht verstanden was ich meinte. FE_SET_PROPERTY wird im dvbcore abgehandelt. Ein dvb_adapter (wie vtuner es ist) bekommt davon nichts mit. Erst ein DTV_TUNE wird über einen Event ins frontend weitergereicht. Und dann funktioniert halt nur noch "kein Lock" innerhalb einer bestimmten Zeit zurückzugeben. Hat aber nix damit zu tun das (und genau das war meine Intenion!) z.B. auf DTV_FREQUENCY der vtuner mit EINVAL antworten könnte.


    Es geht schlicht nicht, denn DTV_FREQUENCY wird dvbcore-intern so abgehandelt:

    Code: dvb_frontend.c
        int r = 0;
    [...]
        case DTV_FREQUENCY:
            c->frequency = data;
            break;
    [...]
        return r;

    Da müsste es schon mit Zauberei zugehen das FE_SET_PROPERTY mit DTV_FREQUENCY ein EINVAL zurückgibt...

  • wirbel: Ja ok dann hast Du es nicht verstanden was ich meinte.

    Na dann denk mal nach, woher dort die Informationen herkommen. Über ein struct im Treiber mit function pointers.

    Klingelts?

    Code
    fe->ops.tune
    • Offizieller Beitrag

    Auf Nutzerwunsch verschoben aus:


    HowTo: APT pinning

  • Na dann denk mal nach, woher dort die Informationen herkommen. Über ein struct im Treiber mit function pointers.

    Klingelts?

    Nein. Es sei denn Du meinst die Asbach-Uralt Funktion fe->ops.set_property. Jaja, damit wäre das gegangen in Zeiten von linux-kernel v4.8 und früher. Seitdem ist die Funktion aber rausgeflogen... Und vtuner unterstützt nur >= v4.16 ...


    "Damals" gingen tatsächlich so Sachen:

    Da war es möglich einen DTV_TUNE direkt im FE_SETPROPERTY ioctl mit -EINVAL abzuschmettern.. Ist aber seit kernel v4.9 auch mit rausgeflogen...


    Code
    fe->ops.tune

    tune wird nach dem FE_SETPROEPRTY ioctl über ein Event im Frontend-Thread aufgerufen, alles schonmal geschrieben. Liest Du überhaupt was ich schreibe?


    Also ich denke Du weisst nicht wie sowas geht oder spielst mit mir Oberlehrer vs. dummer Junge mit so knäpplichen "such die richtige Antwort".


    Wie dem auch sei, hier liegt meine Datei vtunerc_proxyfe.c - da kannste mir mal die Zeilennummer nennen oder einen Codeschnipsel zeigen wo ich mit einem einfach return -EINVAL dem vdr vor dem Tunen, also direkt im FE_SETPROPERTY ioctl rückmelden kann das der Kanal von diesem frontend nicht geliefert werden mag.... Bis dahin... Bitte keine weiteren Verwirrungsantworten. Danke!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!