Forum: PC-Programmierung Kernel Modul mit GPIOs Raspberry Pi


von Markus R. (mark989)


Lesenswert?

Hi,
hat jemand hier schon Erfahrung mit GPIO-Programmierung aus dem 
Kernelspace? Wie die GPIO Pins zu deklarieren sind(Makros), und welche 
Headers noch benötigt werden(außer linux/gpio.h)?
Mit dem folgenden Ansatz funktioniert es bei mir leider nicht(-> Invalid 
GPIO):
1
#define PIN  GPIO_P1_24
2
3
  bool valid = false;
4
5
  //Initialize GPIO
6
  if(gpio_request(PIN, PIN_DESC)) 
7
          printk("GPIO request failure: %s\n", PIN_DESC);  
8
  
9
  valid = gpio_is_valid(PIN);
10
11
  if(valid==0){
12
    printk(KERN_ALERT "Valid GPIO!!\n");
13
  }
14
  else{
15
    printk(KERN_ALERT "Invalid GPIO!!\n");
16
  }   
17
  gpio_direction_output(PIN, 0);//Initial output value
18
19
        gpio_set_value(PIN, 1);
20
        gpio_set_value(PIN, 0);

Gruß Markus

von Thomas M. (thomil)


Lesenswert?

Wo und wie ist denn GPIO_P1_24 definiert?

von Markus R. (mark989)


Lesenswert?

Genau das weiß ich nicht! Und ich kann per google nicht finden welchen 
Header ich einzubinden habe, wo es definiert sein könnte.

von Markus R. (mark989)


Lesenswert?

Nach der Beschreibung funktioniert es leider auch nicht:
http://morethanuser.blogspot.de/2013/04/raspbery-pi-gpio-interrupts-in-kernel.html

von Tobi (Gast)


Lesenswert?

Moin,

geht es vieleicht etwas genauer als nur "geht nicht" ?
Was hast du gemacht und zeig mal deinen Quellcode ?

Gruss,
Tobi

von Thomas M. (thomil)


Lesenswert?

Tja, wenn du irgendwelche defines verwendest, wo du mal weißt wo die her 
kommen und welchen Wert sie haben, kannst du nicht erwarten, dass alles 
wie gewünscht funktioniert.

ein gpio_request() und ein gpio_direction_* sollte genügen.

Wenn du dein PIN mal mit

#define PIN    17

definierst, steuerst du den GPIO Pin 17. Das heißt nicht dass es der Pin 
17 am PIN Header auf der Platine ist. Im raspberry pi wiki gibt es ein 
diagram wo alle GPIO pins eingezeichnet sind.

Und was genau funktioniert an der anderen Beschreibung nicht?

von Markus R. (mark989)


Lesenswert?

Ich habe jetzt im Makro: #define PIN 24 hab es auf dem PIN gemessen, und 
es funktioniert. Trotzdem wird beim einbinden des Moduls "GPIO request 
failure: " und  "Invalid GPIO!!" ausgegeben.

von Thomas M. (thomil)


Lesenswert?

Alles was gpio_is_valid() tut, ist schauen, ob der übergebene Pin >= 0 
und < ARCH_NR_GPIO ist.

Der generische ARM code definiert ARCH_NR_GPIO mit CONFIG_ARCH_NR_GPIO. 
CONFIG_ARCH_NR_GPIO wiederum kann man in der kernel config beim 
compilieren festlegen.

In der raspberry pi defconfig wird CONFIG_ARCH_NR_GPIO aber nicht 
festgelegt, und daher mit 0 belegt. Deshalb ist bei meinem selber 
compilierten kernel ARCH_NR_GPIO ebenfalls 0.

Ich gehe davon aus, dass dies bei den offiziellen Kerneln genauso ist.

gpio_is_valid() prüft also ob dein übergebener Pin >= 0 && < 0 ist.

Ohne kernel neu compilieren wird gpio_is_valid() also immer false 
liefern.

Wenn dein PIN aber tatsächlich ungültig wäre, würde gpio_request() schon 
einen Fehler liefern, wodurch dein gpio_is_valid() sowieso redundant 
ist.

Edit: Und dein gpio_request() failure könnte dadurch auftreten, dass du 
den gpio pin schon vorher requested hast, dann aber nicht freigegeben. 
Siehst du diese Meldung auch nach einem reboot?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.