के माध्यम से मैं बीगलबोन पर एक एलईडी झपकी के लिए एक सी प्रोग्राम लिखने की कोशिश कर रहा हूं। मुझे पता है कि मैं sysfs के तरीके का उपयोग कर सकता हूं ... लेकिन मैं देखना चाहता हूं कि भौतिक पता स्थान मैपिंग/dev/mem के साथ एक ही परिणाम प्राप्त करना संभव है या नहीं।ड्राइविंग बीगलबोन जीपीआईओ/dev/mem
मैं निम्नलिखित सामग्री बुद्धि beaglebone_gpio.h एक हेडर फाइल है,:
#ifndef _BEAGLEBONE_GPIO_H_
#define _BEAGLEBONE_GPIO_H_
#define GPIO1_START_ADDR 0x4804C000
#define GPIO1_END_ADDR 0x4804DFFF
#define GPIO1_SIZE (GPIO1_END_ADDR - GPIO1_START_ADDR)
#define GPIO_OE 0x134
#define GPIO_SETDATAOUT 0x194
#define GPIO_CLEARDATAOUT 0x190
#define USR0_LED (1<<21)
#define USR1_LED (1<<22)
#define USR2_LED (1<<23)
#define USR3_LED (1<<24)
#endif
और उसके बाद मैं अपने सी कार्यक्रम, gpiotest.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "beaglebone_gpio.h"
int main(int argc, char *argv[]) {
volatile void *gpio_addr = NULL;
volatile unsigned int *gpio_oe_addr = NULL;
volatile unsigned int *gpio_setdataout_addr = NULL;
volatile unsigned int *gpio_cleardataout_addr = NULL;
unsigned int reg;
int fd = open("/dev/mem", O_RDWR);
printf("Mapping %X - %X (size: %X)\n", GPIO1_START_ADDR, GPIO1_END_ADDR, GPIO1_SIZE);
gpio_addr = mmap(0, GPIO1_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_START_ADDR);
gpio_oe_addr = gpio_addr + GPIO_OE;
gpio_setdataout_addr = gpio_addr + GPIO_SETDATAOUT;
gpio_cleardataout_addr = gpio_addr + GPIO_CLEARDATAOUT;
if(gpio_addr == MAP_FAILED) {
printf("Unable to map GPIO\n");
exit(1);
}
printf("GPIO mapped to %p\n", gpio_addr);
printf("GPIO OE mapped to %p\n", gpio_oe_addr);
printf("GPIO SETDATAOUTADDR mapped to %p\n", gpio_setdataout_addr);
printf("GPIO CLEARDATAOUT mapped to %p\n", gpio_cleardataout_addr);
reg = *gpio_oe_addr;
printf("GPIO1 configuration: %X\n", reg);
reg = reg & (0xFFFFFFFF - USR1_LED);
*gpio_oe_addr = reg;
printf("GPIO1 configuration: %X\n", reg);
printf("Start blinking LED USR1\n");
while(1) {
printf("ON\n");
*gpio_setdataout_addr= USR1_LED;
sleep(1);
printf("OFF\n");
*gpio_cleardataout_addr = USR1_LED;
sleep(1);
}
close(fd);
return 0;
}
है उत्पादन होता है:
Mapping 4804C000 - 4804DFFF (size: 1FFF)
GPIO mapped to 0x40225000
GPIO OE mapped to 40225134
GPIO SEDATAOUTADDR mapped to 0x40225194
GPIO CLEARDATAOUTADDR mapped to 0x40225190
GPIO1 configuration: FE1FFFFF
GPIO1 configuratino: FE1FFFFF
Start blinking LED USR1
ON
OFF
ON
OFF
...
लेकिन मुझे एलईडी ब्लिंकिंग दिखाई नहीं दे रही है।
आप इस कार्यक्रम के उत्पादन कॉन्फ़िगरेशन सही है, FE1FFFFF, सुसंगत है से देख सकते हैं के बाद से GPIO1_21, GPIO1_22, GPIO1_23 और GPIO1_24 आउटपुट के रूप में विन्यस्त कर रहे हैं, हर एक एक एलईडी चला।
कारण के बारे में कोई विचार?
मैं समाधान पाया है ... यह केवल MAP_PRIVATE के बजाय mmap में MAP_SHARED उपयोग करने के लिए आवश्यक है। मैं वैसे भी सवाल छोड़ देता हूँ। शायद यह किसी और के लिए उपयोगी होगा। – salvo
यह आपके अपने प्रश्न का उत्तर देने के लिए बिल्कुल सही अभ्यास है, जब तक कि दूसरों को इसका उत्तर देने का एक उचित मौका भी दिया जाता है। – Lundin