Forum: Mikrocontroller und Digitale Elektronik Grasshopper - Linux - direkte PORT Programmierung möglich ?


von Mirko Roller (Gast)


Lesenswert?

Hallo,

ich versuche durch ein kleines C Programm die LEDs direkt am Grasshopper 
zu programmieren. ( direkter Zugriff auf die HW )

Leider gibt es nur nen Segmentation Fault


#define PIOA (*(volatile unsigned *)0xFFE02800)
PIOA = ( (1<<23) | (1<<24) );


Sollte nach meinem Verständnis LED PA23 und PA24 einschalten.


Wer weis einen Rat ?

Gruß,

Mirko

von Manuel (Gast)


Lesenswert?

Ohne jetzt die genauen Details zu kennen würde ich sagen das das aus dem 
Userspace NICHT funktioniert. Da muß man dann schon einen Kerneltreiber 
programmieren.

von Marius W. (mw1987)


Lesenswert?

Den Segmentation Fault gibt es zu recht. Denn du hast den Sinn des 
Userspace nicht verstanden. Dein Programm läuft eben in diesem 
Userspace. Das heißt es hat nur eingeschränkte Rechte und kann nur auf 
den Speicher zugreifen, den es zugewiesen bekommen hat.
Versucht es, einen anderen Speicherbereich zu lesen oder zu schreiben, 
dann kommt eben ein Seg Fault.

Wenn du dir einen Kernel-Treiber programmierst, dann sind solche Aufrufe 
ohne weiteres möglich, da du dich im Kernel-Space befindest. Dann bist 
du aber auch dafür verantwortlich, dass der Treiber die Systemstabilität 
nicht beeinflusst.

MfG
Marius

von zwieblum (Gast)


Lesenswert?

wenn der port in ram gemappt wird, dann kannst du über /dev/mem darauf 
zugreifen. ist ja auch nur ein file :-) aber pass auf was du da machst 
...

von Mirko Roller (Gast)


Lesenswert?

per /dev/mem kann man per mmap nicht auf den Addressbereich von den gpio 
zugreifen :(

Ich veruchte nun den "einfachen weg"

Die LEDs sind an Port0 (A) PA23-PA30 angeschlossen.

#--------------------------------------------------------#
mkdir /config/gpio/leds

#specifies which PIO controller to use (PIOA = 0, etc.)
echo 0 > /config/gpio/leds/gpio_id

# specifies which particular pins to use on the controller.
echo 0xff00 > /config/gpio/leds/pin_mask     # Use pins PA23-PA31

# specifies which pins are used as outputs.
echo 0xff00 > /config/gpio/leds/oe_mask      # Enable output on pins 
23-31

# specifies whether the gpio object is active. Write "1" to this file in 
order to create the gpio device.
echo 1 > /config/gpio/leds/enabled         # Create the device

#---------------------------------------------------------#

Es wird nun aber laut dmesg kein /dev/gpio0 angelegt :(
Wenn ich es per Hand anlege mit mknod /dev/gpio0 c 254 0
und mit einem Programm darauf zugreifen will, passiert nichts.

$ cat /dev/gpio0
cat: /dev/gpio0: No such device or address
$ ls -al /dev/gpio0
crw-r--r--    1 root     root     254,   0 Dec 31 18:12 /dev/gpio0

Da weis ich nun nicht mehr weiter :(

von Marius W. (mw1987)


Lesenswert?

Dir ist aber schon klar, dass 0xff00 nicht gleich 0xff000000 ist?! Du 
hast eine 32-bit-Architektur und da sind halt auch die GPIO-Register 
32-bit breit.

Wobei das vermutlich nicht der Fehler ist.

MfG
Marius

von zwieblum (Gast)


Lesenswert?

damit's /dev/gpio0 gibt musst du das passende kernelmodul laden.

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.