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
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.
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
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 ...
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 :(
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.