Homepage Wiki Forum Buy

GNUBLIN embedded GNU/Linux

Open source learning and training plattorm for embedded GNU / Linux
A projects from Hochschule Augsburg and embedded projects GmbH

Project homepage: http://www.gnublin.org
Wiki: http://wiki.gnublin.org
Aktuelle Zeit: Fr 22. Sep 2017, 01:01

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mo 3. Jun 2013, 11:36 
Offline

Registriert: Fr 12. Apr 2013, 20:25
Beiträge: 16
Moin moin,

ich wollte einen Doppel-Post vermeiden, jedoch meldet sich im "Fortgeschrittenen" Teil des Forums niemand. Ich hatte dort einen alten Thread fort geführt: http://forum.gnublin.org/viewtopic.php?f=4&t=171.

Ich habe einiges ausprobiert, konnte aber zu keinem positiven Ergebnis kommen: Ich bin überhaupt nur auf die poll() Methode gekommen, weil ich einen entsprechenden Wiki Eintrag gelesen hatte. Dort wird vorgestellt, wie man mithilfe von poll() Intterupt verhalten imitieren kann (so hatte ich es verstanden). Das Wiki beschreibt, dass zuerst die Datei /sys/class/gpio/gpiox/edge mit "falling" überschrieben werden müsse. "x" steht dabei für einen möglichen GPIO-Pin. Mehrere Versuche mit "echo" führten nur dazu, dass ich feststellen musste, dass ich nicht in diese Datei schreiben darf, ähnlich Ergebnisse konnte ich mit C und fopen feststellen. Öffnen ist unproblematisch, schreiben führt immer zu "invalid argument" Fehlern.

Ich hatte erst angenommen, dass Schreibrechte Fehlen. Die ist nicht der Fall, ich hatte ein chmod +a rw hinzugefügt um auf Nummer sicher zu gehen. Dies ändert jedoch nichts an der Tatsache, dass ich die Datei immer noch nicht verändern und somit poll() nicht nutzen kann.

Dann las ich den oben genannten Forumsbeitrag und habe einen neuen Kern mit unstable-Branch gebaut. Immer noch negativ. Langsam bin ich am verzweifeln, mir gehen derbst die Ideen aus, was es noch sein kann! Ich vermute den Toifel im Detail...

Diese Funktion würde ich sehr gerne mal ausprobieren, ich habe eine geeignete Anwendung mit einem externen AD-Wandler, welcher ein Interrupt pin hat und alle 10ms triggert...nur leider kriege ich es einfach nicht hin. Findet sich jemand der mir helfen kann? Das Problem oder sogar eine Lösung kennt?

Viele Grüße und schonmal Dank fürs Lesen ;-)
Das TestObjekt


Nach oben
 Profil  
 
BeitragVerfasst: Mo 3. Jun 2013, 12:20 
Offline

Registriert: Fr 8. Mär 2013, 09:41
Beiträge: 39
hallo,

was gibt es denn genau für eine Meldung, wenn du versuchst mit echo " " > edge in die datei zu schreiben?

ich habe es gerade mit dem 2.6.33 kernel aus dem master branch ausprobiert:
Code:
root@gnublin:~# cd /sys/class/gpio/
root@gnublin:/sys/class/gpio# echo "14" > export
root@gnublin:/sys/class/gpio# echo "rising" > gpio14/edge
root@gnublin:/sys/class/gpio# cat gpio14/edge
rising


exakt das Beispielbprogramm kompiliert ergibt dann folgende Ausgabe:
Code:
root@gnublin:~# ./a.out
IRQ occured!


grüße
Manuel


Nach oben
 Profil  
 
BeitragVerfasst: Di 4. Jun 2013, 08:33 
Offline

Registriert: Fr 12. Apr 2013, 20:25
Beiträge: 16
Hallo Liebert,
vielen Dank für deine Unterstützung, ich habe gerade nur sehr sporadisch Internet, heute Abend sollte es besser gehen!
also, ich habe mit:
Code:
root@gnublin:~# echo "20" > /sys/class/gpio/export

den GPIO20 initialisiert. ich habe mit
Code:
root@gnublin:~# ls -la /sys/class/gpio/

überprüft, ob er angelegt wurde. Es erscheint neben den anderen ebenfalls ein gpio20. Anschließend wollte ich mit:
Code:
root@gnublin:~# echo "falling" > /sys/class/gpio/gpio20/edge

die Datei von "none" (Voreinstellung) auf "falling" ändern (drdy vom ADW erfordert dies).
Das gibt dann den Fehler:
Code:
bash- : echo- : can't write, invalid argument


Versucht man nun das Testprogramm zu nutzen kommt es natürlich zu Timeout bzw. Arbeitsverweigerung, das "none" gesetzt ist.

Ich vergaß es zu schreiben, aber ich verwende einen 3.3.0 Kernel master/testing branch Development Kernel. Ich kann natürlich noch einmal versuchen, einen 2.6.33 neu aufzusetzen. Aber mit den anderen beiden hat es definitiv nicht funktioniert. Ich hoffe nur, dass dann ssh noch funzt, ich habe nämlich keine picocom fähige Schnittstelle herausgeführt :-)

Viele Grüße,
Das TestObjekt


Nach oben
 Profil  
 
BeitragVerfasst: Mi 5. Jun 2013, 13:31 
Offline

Registriert: Fr 12. Apr 2013, 20:25
Beiträge: 16
Seid gegrüßt,

ich habe auf lieberts Post hin einen 2.6.33 Kern (development, kann man überhaupt andere kriegen?) neu gebaut. Und siehe: TADA. Ich kann den "edge" File beschreiben. Das Testprogramm funzt auch, auch wenn ich nichts habe um den Interrupt auszulösen. Ich kann den Pin nicht spontan high schalten, aber es scheint soweit zu funktionieren. Was mich ein wenig irritiert: muss nicht vorher irgendwann mal die Direction auf "in" geändert werden? Macht Poll das automatisch? Kann ich mir fast nicht vorstellen.

Soweit wäre alles ganz schön, ich musste jedoch feststellen, das unter dem 2.6.33 Kern einfachste Programme nicht gehen, welche SPI also spidev verwenden, wie zum Beispiel folgendes:
Code:
#include <stdint.h>
#include <unistd.h>
#include <getopt.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
        static const char *device = "/dev/spidev0.1";
        int i,fd;
        char wr_buf[1];
        char rd_buf[2];

        fd = open(device, O_RDWR);
        if (fd<=0) {
                printf("%s: Device %s not found\n", argv[0],*device);
                exit(1);
        };
        for (i = 0; i < 100; i++)
        {
                wr_buf[0] = 0x38;
                write(fd, wr_buf, ARRAY_SIZE(wr_buf));
                read(fd, rd_buf, ARRAY_SIZE(rd_buf));
                        printf("%02X %02X \n", rd_buf[0], rd_buf[1]);
                usleep(8);
        };
        close(fd);
        return 0;
}

Dieses Programm läuft einwandfrei auf dem 3.3.0 Kernel! Aber hier geht definitiv irgendwas nicht richtig in Bezug auf poll() (poll soll das absolut grottige usleep(8) ersetzen...). Das beschreiben von "edge" ist hier unmöglich:
Code:
root@gnublin:~/SPI_Geschichten# echo 18 > /sys/class/gpio/export
root@gnublin:~/SPI_Geschichten# echo "falling" > /sys/class/gpio/gpio18/edge
-bash: echo: write error: Invalid argument

Es gibt überhaupt keine Möglichkeit in diese Datei zu schreiben, egal was man macht! (unter 3.3.0 jetzt)

Zur Zeit habe ich also die Wahl zwischen Pest und Cholera: entweder geht spidev oder es geht poll(), aber nicht beides zusammen. Mir ist bei der Installation ebenfalls aufgefallen, das der 2.6.33 viele EInträge in seiner board-eax313x.c nicht hat, welche aber in der 3.3.0 Entsprechung vorhanden sind. In meiner Naivität, habe ich die einfach mal angeglichen...nun...das geht wohl eher nicht:-D musste ich feststellen.
Übrigens die Fehler, die spidev generiert sehen wie folgt aus (auf einem 2.6.33 Kernel bei Ausführung obigen Programmes mit angepasster /dev Benennung, unter 3.3.0 /dev/spidev0.1 und unter 2.6.33 /dev/spidev0.5, warum auch immer):
Code:
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:Internal error: Oops: 17 [#1]
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:last sysfs file: /sys/devices/platform/pnx-i2c.1/i2c-1/name
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:Process spi_lpc313x.0 (pid: 367, stack limit = 0xc1d2a270)
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:Stack: (0xc1d2bf18 to 0xc1d2c000)
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bf00:                                                       c1cf04c0 c01ee668
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bf20: 00000001 c1d2a000 c1dcdf10 c1cf04e0 c1d2bf44 c1cf04d8 00000000 c04a5444
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bf40: c1ce40e0 c0058c3c c049f6f0 c1d2a000 c1d2bf94 c0365720 00000002 c0058b94
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bf60: c1c1801c c1cedc60 00000017 c1cedc60 00000000 c1d22920 c1d2a000 c1d2bf9c
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bf80: c01ee4e0 c1d22928 00000000 00000000 00000000 c00519e0 c1d2bfd4 00000000
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bfa0: c1cedc60 c0054e20 c1d2bfa8 c1d2bfa8 c1d2bfd4 c1c19e70 c1d2bfd4 c005187c
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bfc0: c1d22920 00000000 00000000 c0054a6c 00000000 00000000 c1d2bfd8 c1d2bfd8
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:bfe0: 00000000 00000000 00000000 00000000 00000000 c0028dac 0f0f0f0f 0f0f0f0f
Message from syslogd@gnublin at Jan  1 00:04:30 ...
 kernel:Code: e1a02001 e59f101c e1a0c000 e7913003 (e593102c)

Ich habe zwar keine Ahnung von Kernel Oooops(?^^) Fehlern, aber sieht irgendwie wie eine art Speicherzugriffsfehler aus? ist kein echter crash, scheint aber spidev zu eliminieren. Interessant ist, dass der 3.3.0 Kernel nicht betroffen ist! Sehr seltsam, aber da geht auch poll() nicht.

Neue Frage im alten Thread also:
Hat jemand eine Idee, wie ich poll() auf dem 3.3.0 zum Laufen kriege, läuft es bei wem? Kann jemand bestätigen das der half-duplex mode mit spi nicht funktionier auf dem 2.6.33, wenn nein, wie hat er es zum laufen bekommen?
Wechsel nach 2.6.33 bringt es nicht, da ich ein nicht funktionierendes (oder von mir nicht kontrollierbares) spidev als das größere Übel empfinde, immerhin funzt mein ADW dann nicht:-D! Und da ich ein Anfänger bin und für das Projekt nicht mehr soviel Zeit habe (mitte Juli) bin ich sogar für ziemlich miese/dreckige Tipps zu haben!;-)

Vielen Dank schonmal, dass ihr Zeit und Hirnschmalz investiert! Ihr ahnt nicht wie ihr mir helft. Grüße,
das TestObjekt


Nach oben
 Profil  
 
BeitragVerfasst: Mi 5. Jun 2013, 13:44 
Offline

Registriert: Do 7. Mär 2013, 10:13
Beiträge: 18
Zum SPI-Problem:

ich gehe jetzt mal davon aus, dass du überprüft hast das die passenden SPI Devicefiles vorhanden sind und du das Kernelmodul richtig geladen hast.

Hast du schon mal den Bus zugriff mit den ioctl-Kommandos probiert?


Nach oben
 Profil  
 
BeitragVerfasst: Mi 5. Jun 2013, 14:31 
Offline

Registriert: Fr 12. Apr 2013, 20:25
Beiträge: 16
Hallo felix,

ich hatte spi fest eingebaut, also mit Sternchen "*" in menuconfig, im 2.6.33 ebenso wie in 3.3.0 da es in 3.3.0 ging, ging ich blauäugig mal davon aus, dass keine Fehler aufgetreten sind beim 2.6.33. dmesg war jedenfalls unauffällig. Leider funktioniert der neueste 2.6.33er nicht und ich habe den alten weggeworfen...es wird also wohl ein neuer compiled werden müssen! Allerdings führt der Sternchen Einbau leider auch dazu, das unter lsmod nichts auftaucht. bzw. nichts, was mit spidev zu tun hat. Da sind nur die USB-Ethernet Konverter mit drauf!

Die device files waren vorhanden auf beiden Kerneln gab es jeweils ein /dev/spidev0.1 bzw 0.5.

Und nein, ich habe noch nicht mit ioctl gearbeitet, insgesamt noch nicht;)
Ich mache gleich mal einen neuen 2.6.33 ohne meine kryptischen Änderungen, mal sehen ob der geht, der Vorgägnger geht nicht. Dann führe ich mir mal ioctl zu Gemüte.

Danke für die Tipps,
Das TestObjekt


Nach oben
 Profil  
 
BeitragVerfasst: Mi 5. Jun 2013, 14:49 
Offline

Registriert: Do 7. Mär 2013, 10:13
Beiträge: 18
hallo,

ich würde dir auf jedenfall nochmal empfehlen den SPI-Treiber mit passender CS-Pin zu laden

Code:
modprobe cs_pin=XX

ohne cs_pin wird Standardmäßig GPIO 11 als CS_Pin genutzt.

SPI ist bei den normalem Kernel immer mit dabei nur nicht von vornherein geladen.

Du kannst für den SPI Zugriff auch unsere API nutzen, die erledigt das bereits mit ioctl. Beim Senden haben wir da noch keine Probleme gefunden, den Datenempfang mit der Klasse konnten wir leider noch nicht ausgiebig testen, da würden wir uns noch um Feedback freuen.

Sollte dir die API insgesamt zu groß sein oder dergleichen, dann kannst du auch die Dateien spi.h spi.cpp und includes.h aus dem GIT ziehen und mit wenigen Anpassungen zum laufen bekommen.


Nach oben
 Profil  
 
BeitragVerfasst: Do 6. Jun 2013, 14:27 
Offline

Registriert: Fr 12. Apr 2013, 20:25
Beiträge: 16
Moin moin,

ah, ich verneige mich demütigst! Auf dem 3.3.0 kann man den fest verbauen, dort entfällt der Schritt mit dem laden des Moduls. Im 2.6.33 geht das jedoch nicht. Habe das Laden nachgeholt mit:
Code:
modprobe spidev cs_pin=19

und schon war das Device richtig und komplett da. Sehr schön. Ich habe jedoch festgestellt, dass poll() zu langsam ist. War ja auch irgendwie nicht anders zu erwarten (zu viele Filezugriffe^^)! Trotzdem vielen Dank für die Hilfe!

In Bezug auf die API habe ich da so ein paar Fragen, die mögen sehr unbedarft klingen, aber ich programmiere sonst nicht in C, dass hier ist ein Lernausflug für mich! Inwieweit ist denn eure API oder Teile davon kompatibel mit C? die ist ja für C++ gedacht. (nicht zu fest schlagen:D) aber ich schätze beliebiges mischen ist da nicht?^^

Grüße,
TestObjekt


Nach oben
 Profil  
 
BeitragVerfasst: Sa 8. Jun 2013, 11:39 
Offline
Administrator

Registriert: Sa 7. Apr 2012, 09:18
Beiträge: 251
Hallo,

wir haben das schon länger auf unserer Wunschliste. Wir schauen mal nächste Woche, dass wir das testen und beschreiben.

Eigentlich muss man nur eine .h Datei anpassen und die API als Bib z.B. .a verwenden.


Nach oben
 Profil  
 
BeitragVerfasst: Di 11. Jun 2013, 14:41 
Offline

Registriert: Fr 12. Apr 2013, 20:25
Beiträge: 16
Moin moin,

ah okay. Nun wenn da was bei rauskommt, kannst du das hier posten? Gibt bestimmt noch andere Anfänger, die das interessieren könnte!

Ich werde mich mal weiter dem polling widmen. TCP clients und server habe ich nach Wochen des bastelns ( :oops: ) endlich auch zum laufen gekriegt...jetzt muss das nur noch abgeglichen werden.

Die gpio Funktionen, die hier hoch geladen sind und auch im Wiki hier in Forum verlinkt wurden, wurden diese mal durchgetestet? Ich habe hier gelesen, dass die unter gewissen Umständen "Macken" haben. Das eine oder andere läuft da auch bei mir seltsam. Ergebnisse poste ich dann mal in einem anderen post, hat ja mit poll() im eigentlichen Sinne nichts zu tun ;). Das Framework habe ich allerdings nicht verwendet.

Grüße und nocheinmal ein großeß Dankeschön für die Hilfe,
Das TestObjekt


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de