#include #if CONFIG_HAL_BOARD == HAL_BOARD_LINUX || CONFIG_HAL_BOARD == HAL_BOARD_ERLE #include "GPIO.h" #include #include #include #include #include #include #include #include #include using namespace Linux; struct GPIO{ volatile unsigned *base; volatile unsigned *oe; volatile unsigned *in; volatile unsigned *out; }gpio0,gpio1,gpio2,gpio3; LinuxGPIO::LinuxGPIO() {} void LinuxGPIO::init() { int mem_fd; // Enable all GPIO banks // Without this, access to deactivated banks (i.e. those with no clock source set up) will (logically) fail with SIGBUS // Idea taken from https://groups.google.com/forum/#!msg/beagleboard/OYFp4EXawiI/Mq6s3sg14HoJ system("echo 5 > /sys/class/gpio/export"); system("echo 65 > /sys/class/gpio/export"); system("echo 105 > /sys/class/gpio/export"); /* open /dev/mem */ if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) { printf("can't open /dev/mem \n"); exit (-1); } /* mmap GPIO */ gpio0.base = (volatile unsigned *)mmap(0, GPIO_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO0_BASE); if ((char *)gpio0.base == MAP_FAILED) { printf("mmap error %d\n", (int)gpio0.base); exit (-1); } gpio1.base = (volatile unsigned *)mmap(0, GPIO_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO1_BASE); if ((char *)gpio1.base == MAP_FAILED) { printf("mmap error %d\n", (int)gpio1.base); exit (-1); } gpio2.base = (volatile unsigned *)mmap(0, GPIO_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO2_BASE); if ((char *)gpio2.base == MAP_FAILED) { printf("mmap error %d\n", (int)gpio2.base); exit (-1); } gpio3.base = (volatile unsigned *)mmap(0, GPIO_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, GPIO3_BASE); if ((char *)gpio3.base == MAP_FAILED) { printf("mmap error %d\n", (int)gpio3.base); exit (-1); } gpio0.oe = gpio0.base + GPIO_OE; gpio0.in = gpio0.base + GPIO_IN; gpio0.out = gpio0.base + GPIO_OUT; gpio1.oe = gpio1.base + GPIO_OE; gpio1.in = gpio1.base + GPIO_IN; gpio1.out = gpio1.base + GPIO_OUT; gpio2.oe = gpio2.base + GPIO_OE; gpio2.in = gpio2.base + GPIO_IN; gpio2.out = gpio2.base + GPIO_OUT; gpio3.oe = gpio3.base + GPIO_OE; gpio3.in = gpio3.base + GPIO_IN; gpio3.out = gpio3.base + GPIO_OUT; close(mem_fd); } void LinuxGPIO::pinMode(uint8_t pin, uint8_t output) { if(output == GPIO_INPUT){ if(pin/32 < 1){ *gpio0.oe = *gpio0.oe | (1<