TSIC pigpio und Kernel Module

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi,

    Ich muss mal wieder ein Thema erstellen, da ich erneut in einem Bereich des Pi bzw Linux gelandet bin, in dem ich nicht weiter komme. Ich habe folgenden Sensor *klick*. Diesen möchte ich entsprechend mit dem Pi (in diesem Fall in Pi2 B) verwenden. Bei meinen Recherchen bin ich lediglich auf einen Thread gestoßen in dem jemand zunächst ein Kernel Modul entwickelt hat, welches den Pi befähigt mit dem Sensor umgehen zu können (https://code.google.com/archive/p/tsic-kernel/).
    Allerdigs hat der selbe User auch eine Varainte mit pigpio und einem c++ skript vorgestellt (https://code.google.com/archive/p/tsic-pigpio/). Da dies deutlich einfacher ist zu realisieren, habe ich zunächst das getan.
    Der Sensor wird auch erkannt und es werden Temperaturen ausgegeben, diese liegen aber etwa 17 °C über der eigentlichen Temperatur.
    Auf Anhieb konnte ich in den skripten für PiGpio keinen Grund für die große Abweichung ausmachen. Hat da jemand eine Idee woran es liegen könnte?

    Jedenfalls habe ich mich dann dem Kernel Modul zugewandt um zu testen, ob dieses bessere Ergebnisse liefert. Bin aber leider nicht sonderlich weit gekommen.
    Wie in seiner Anleitung hier https://code.google.com/archive/p/tsic…sCompilePi.wiki, habe ich auf einem laptop mit Linux (Mint) zunächst die toolchain installiert, wie es hier angegeben wird.
    Anschließend habe ich

    Code
    git clone --depth 1 git://github.com/raspberrypi/linux.git


    und hinterher

    Code
    make mrproper

    im "Linux" Verzeichnis ausgeführt. Als nächstes die config datei von meinem Pi in das linux Verzeichnis, wie angegeben, kopiert.
    Bis hierhin schien noch alles geklappt zu haben. Nun sollte ich mir die entsprechende Modul.symvers raussuchen und in das linux Verzeichnis laden. Mein Pi benötigt die Version 3.18.11-v7+, diese ist jedoch auf der verlinkten Seite nicht vorhanden. Da soweit ich weiß die API rückwärtskompatibel sein soll, habe ich Version 3.18.12 genommen.
    Im letzten Schritt passiert dann das was ich am wenigsten verstehe und wo der erste Fehler auftritt (der wahrscheinlich auf einem Fehler schon viel weiter vorne basiert).
    Da ich keine Ahnung habe, wie ich den Befehl der dort angegeben ist (null formatiert), eingeben muss, habe ich es wie folgt getan:

    Code
    ``` ARCH=arm CROSS_COMPILE=${CCPREFIX} make oldconfig ARCH=arm CROSS_COMPILE=${CCPREFIX} make menuconfig ARCH=arm CROSS_COMPILE=${CCPREFIX} make modules_prepare ```

    Dabei bekomme ich die Fehlermeldung:

    Code
    Makefile:517: target 'make' given more than once in the same rule
    scripts/basic/fixdep.c:106:23: fatal error: sys/types.h: No such file or directory
    compilation terminated.
    make[2]: *** [scripts/basic/fixdep] Error 1
    make[1]: *** [scripts_basic] Error 2
    make: *** [__build_one_by_one] Error 2
    HOSTCC: command not found

    Wäre auf jeden Fall interessant zu wissen, wo meine Fehler liegen. Speziell der merkwürdige Befehl am Ende braucht erklärung. :s

    BN

  • Wie ist denn die Variable CCPREFIX gesetzt? Die muss passen, sonst klappt's nicht mit dem crosscompilieren.

    Wie dem auch sei, der entscheidende Teil des Treibers ist

    temp = (MAX_TEMP - MIN_TEMP) * SCALE_FACTOR * raw / 2047 + MIN_TEMP * SCALE_FACTOR;

    Und die ist exakt gleich zu der in dem PIGPIO-Beispiel, inklusive der Verwandten Konstanten. Du wirst also keine anderen Ergebnisse bekommen. Warum der nun 17 Grad daneben liegt... kA. Aber dir das System mit einem defekten Kernel zu verhunzen wird daran nix aendern, das kann ich dir versprechen :)

    Last but not least: Skripte schreibt man in Skriptsprache. Wie Perl, Python, TCL etc. C++ ist keine Skriptsprache. Das ist ein Source, Quellcode, oder einfach Programm.


  • Wie ist denn die Variable CCPREFIX gesetzt? Die muss passen, sonst klappt's nicht mit dem crosscompilieren.

    Wie dem auch sei, der entscheidende Teil des Treibers ist

    temp = (MAX_TEMP - MIN_TEMP) * SCALE_FACTOR * raw / 2047 + MIN_TEMP * SCALE_FACTOR;

    Und die ist exakt gleich zu der in dem PIGPIO-Beispiel, inklusive der Verwandten Konstanten. Du wirst also keine anderen Ergebnisse bekommen. Warum der nun 17 Grad daneben liegt... kA. Aber dir das System mit einem defekten Kernel zu verhunzen wird daran nix aendern, das kann ich dir versprechen :)

    Last but not least: Skripte schreibt man in Skriptsprache. Wie Perl, Python, TCL etc. C++ ist keine Skriptsprache. Das ist ein Source, Quellcode, oder einfach Programm.

    Danke für die sehr aufschlussreiche Antwort! Ich gelobe Besserung im Unterscheiden zwischen Skript und Sourcecode/Programm/etc :)
    Dann werde ich auf jeden Fall nochmal weiter mit der PiGPIO rumprobieren und schauen, ob ich den Fehler finde.

  • Hab den Fehler gefunden. Also als Ergänzung, falls irgendwann nochmal jemand auf das Problem stoßen sollte. Der Fehler lag darin das ich ein anderes Modell des Sensors verwende. Das c++ Programm war auf den Tsic306 angepasst. Der Tsic506 bzw 506f verwendet andere Minima and Maxima.
    In tsic.cpp wird als Minimum -50 und als Maximum +150 angegeben. Der 506f braucht allerdings um richtige Werte auszugeben ein Minimum von -10 und ein Maximum von 60. Diese Werte einfach am Beginn der tsic.cpp entsprechend ändern, neu kompilieren und schon funktioniert es.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!