Kernel Modul mit GPIOs Raspberry Pi

OP #3223944
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
#3224133
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?
#3225182
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren